zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

数据库之事务

2023-09-11 14:22:10 时间


为什么要有事务
事务广泛的运用于订单系统、银行系统等多种场景

例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
检查A的账户余额>500元;
A 账户中扣除500元;
B 账户中增加500元;

正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

事务命令
要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎

查看表的创建语句,可以看到engine=innodb
show create table students;

 

修改数据的命令会触发事务,包括insert、update、delete

开启事务,命令如下:

开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
begin;
提交事务,命令如下
将缓存中的数据变更维护到物理表中
commit;

回滚事务,命令如下:
放弃缓存中变更的数据
rollback;

提交


为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表
step1:连接
命令行1:查询学生信息
select * from students;

step2:增加数据
命令行2:开启事务,插入数据
begin;
insert into students(studentNo,name) values ('013','我是新来的');
命令行2:查询数据,此时有新增的数据
select * from students;

step3:查询
命令行1:查询数据,发现并没有新增的数据
select * from students;

step4:提交
命令行2:完成提交
commit;

step5:查询
命令行1:查询,发现有新增的数据
select * from students;

 

加入出现中文乱码,解决方法如下:

set names 'gbk';

set names 'gbk';

set names 'gbk';

回滚

为了演示效果,需要打开两个命令行窗口,使用同一个数据库,操作同一张表

step1:连接
命令行1
select * from students;

step2:增加数据
命令行2:开启事务,插入数据
begin;

insert into students(studentNo,name) values ('014','又来一个');
命令行2:查询数据,此时有新增的数据
select * from students;

step3:查询
命令行1:查询数据,发现并没有新增的数据
select * from students;

step4:回滚
命令行2:完成回滚
rollback;

step5:查询
命令行1:查询数据,发现没有新增的数据
select * from students;