当前课程知识点:数据库技术应用 > 学习情境四、银行存取款机数据库编程 > 模块1、银行存取款机存储过程 > 4.1.2事务
大家好
欢迎来到数据库技术应用在线开放课程
今天我们要完成的任务是事物
银行转账业务的实现那什么是转账
转账总共分成几个步骤
比如我现在要给正在学习的你转账两万元
那么需要两个步骤
第一要从我的卡上先取两万
第二在向你的卡上存两万
那如果这个操作成功转账就成功了
那如果说中间出现了断裂
等等一些情况的时候操作就失败了
那这时候钱去哪了
钱是给了银行还是不翼而飞了
其实如果说在这个操作过程当中失败了的话
我们心里都很清楚
在实际的银行业务当中
这个钱是返回到我的卡上了
不会出现给银行或者不翼而飞的情况
那这是怎么实现的
我们一起来学习一下
本节课我们主要学习的目标就是理解事物的应用
掌握事物的使用方法
我们一起进入知识技能学习
事物是由作为一个单独单元的一个或多个SQL语句组成的
这个单元当中每个SQL语句是互相依赖的
而且单元作为一个整体是不能分割的
如果单元中的一个语句不能完成
那整个单元都会进行回滚
所有的影响数据都会返回到事务开始以前的状态
因而只有事务当中所有语句都成功的执行
才能说这个事务被成功的执行了
比如说大家看的这个图
员工管理系统如果添加员工成功
那么这我们就可以分配部门设置工资和奖金了
否则什么都不做
所以对于事物来说
简单来说它就是一系列操作的集合
要么都做 要么都不做
我们就把它用事物来解决
那要用事物的话
首先用户必须先关闭自动提交
事务才能由多条SQL语句构成
否则作为单个语句执行
那么怎么来关闭
使用下面的语句
set @@ autocommit等于0进行关闭
关闭之后我们就可以开始第一步开始事务
第一个应用程序的第一条SQL语句
或者在commit和rollback语句后面的第一条SQL语句执行后
一个新的事物也就开始了
另外还可以使用一条start transaction语句来显示的启动一个事务
他的语法格式是start transaction 或者是begin work
那么开始事务之后就是结束事务
如果说这个事务要结束
我们用到的关键字是commit他是提交语句
它使得自从事物开始以来所执行的所有数据修改
成为数据库的永久部分
也标志一个事务的结束
第三个撤销事务用rollback语句
他是可以进行事务的撤销的
也就是说他可以撤销所做的修改
结束当前事务
第四个叫回滚事务这一步除了撤销整个事务以外
用户可以选择回滚来回到某一个状态
那既然回到某个状态我们需要提前做一个事情
就是先设置一个保存点
怎么来设置用savepoint identified后面跟上名称
就可以设置一个保存点了
那么下面如果你要进行回滚rollback的话
就可以直接用rollback to savepotion identified
我们的保存点名称
然后回到我们保存点的位置
也就是我们的回滚事务
下面几个语句说明了有关事务的处理过程
我们来看一下
第一个start transaction第二个update
第三个delete第四个是savepoint s1
第五个delete第六个rollback work to savepotion s1
第七个insert第八个commit work
这是一个由八个操作构成的
我们这样一个事物
当然里面包括开始事务回滚保存点等等
这些一系列操作他作为一个整体来实现
那么刚才说到了第一行start transaction
他就是一个开始事务
第二行第三行语句是对数据进行了修改
但是没有提交第四行的设置了一个保存点
第五行删除了数据但是也没有提交
第六行将事务回滚到保存点S1
这时第五行所做的修改被撤销了
第七行修改的数据第八行结束了这个事务
这时237行对数据库的修改被持久化了
这是一个完整的事物过程
那我们来看一下任务实施
你好请问有什么业务需要办理
我想用自动取款机转账请问取款机在什么位置
自动取款机在前面拐角处右转
大家看了我们刚才的转账的动画
重温了转账的过程
那我们来看一下如果在程序事件过程当中
我们的流程图是怎么来画的
首先开始事物需要你比较余额和交易金额的差值money
如果这个money小于1的
说明什么说明他余额不足了
那就不能进行转账操作
所以有一个结束事务
那么如果说money小于1是否
那也就是说他其实余额是满足条件的
那么修改转出卡号的余额
再修改转入卡号的余额
也就是说一个做减法一个做加法
最后在结束事务
转账成功用的是分支结构来判断两种情况
我们来看一下怎么来写这个代码
首先按照咱们刚才说的先set @@ autocommit等于零
然后delimiter$符号
我们先设置一个结束符
create procedure我们来创建存储过程
这里面涉及到了三个参数
大家观察一下
三个参数都是in来控制的
也就是都是输入参数
包括我们的cardID1 cardID2还有一个transmoney
也就是第一张卡的卡号
第二张卡的卡号和我们的交易金额
那begin开始处理
declear money int start transction开始我们的事务
select balance减去transmoney into money from
cardinfo where cardID =cardID1
这里面做了一个提取数据
提取我们的余额和交易金额的差值存在了money里
为的是将来进行判断
好我们就可以判断了if money小于一 then commit
小于1刚才说值执行的是左手边的这个分支
也就是说要提交事务结束了
并且要提示用户select余额不足
无法转账As result
那else也就是说我们的余额满足条件
那就做两个修改
Update set where
update set where刚刚咱们说了
一个是减法一个是加法
也就是先从我的卡上取钱
再从你的卡上存钱这样一个过程
所以大家看这是大家熟悉的update set where语句
那么这两行语句
两个update set 语句在写的过程当中
大家要注意看着card1、card2
也就是我们的
看着cardID1,cardID2不要弄混了
一个是转出卡一个是转入卡
好这两个update写完之后
接下来commit 事务结束
然后色select转账成功
as result
也是给用户一个提示
如果你走这个分支转账是可以的
接下来endif分支结构结束,end 两$符号结束
我们的存储过程结束
最后把结束符恢复成分号
那么我们的事务就做好了
接下来要进行测试
测试的话刚刚咱们说了两个分支
一种是转账失败一种是转账成功
那么根据这两种情况
我们用call来调用存储过程
分别去测试一下
这两个分支能不能正常运行
结果完全正确
那么结果的出现需要大家用select * from cardinfo去查看
那我的任务就完成了
今天的拓展任务是员工管理数据库事务的应用
感谢大家的聆听
-模块1、数据库的基础知识
--数据库的基础知识
-模块2、MYSQL介绍与安装
--MYSQL介绍与安装
-模块3、银行存取款机数据库的创建与维护
--银行存取款机数据库的创建与维护
-模块4、银行存取款机数据库的设计
--银行存取款机数据库的设计
-模块1、表的创建
--2.1表的创建
--表的创建
-模块2、表的管理
--2.2表的管理
--表的管理
-模块3、索引
--2.3索引
--索引
-实践小课堂:宠物电商管理平台数据库和表的创建
-模块1、银行存取款机数据插入、修改和删除
--银行存取款机数据插入、修改和删除
-模块2、银行存取款机简单查询
--银行存取款机简单查询和统计查询
-模块3、银行存取款机连接查询
--3.3连接查询
--银行存取款机连接查询
-模块4、银行存取款机子查询
--3.4子查询
--银行存取款机子查询
-模块5、银行存取款机分类汇总与排序
--银行存取款机分类汇总与排序
-模块6、银行存取款机视图
--银行存取款机视图
-模块1、银行存取款机存储过程
--4.1.2事务
--银行存取款机存储过程
-模块2、银行存取款机触发器
--银行存取款机触发器
-模块1、MYSQL用户管理
--MYSQL用户管理
-模块2、MYSQL权限管理
--MYSQL权限管理
-模块3、MYSQL数据库的锁机制
--MYSQL数据库的锁机制
-模块4、MYSQL备份和恢复
--MYSQL备份和恢复