事务:Transaction详解
1、事务概念:
一组sql语句操作单元,组内所有SQL语句完成一个业务,如果整组成功:意味着全部SQL都实现;如果其中任何一个失败,意味着整个操作都失败。失败,意味着整个过程都是没有意义的。应该是数据库回到操作前的初始状态。这种特性,就叫“事务”。
2、为什么要存在事务?
1)失败后,可以回到开始位置
2)没都成功之前,别的用户(进程,会话)是不能看到操作内的数据修改的
3、事务4大特征ACID:
1)原子性[atomicity]:功能不可再分,要么全部成功,要么全部失败
2)一致性[consistency]:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
3)隔离性[isolation]:事务A和事务B之间具有隔离性
4)持久性[durability]:是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
3、相关概念:
【SQL执行过程】1)执行阶段 2)将执行结果,提交到数据库的阶段
其中我们的事务日志,就是保存执行阶段的结果,如果用于选择提交,则才将执行的结果提交到数据库。
默认的执行方式叫做,自动提交。执行完毕,自动完成提交工作。如果你想要所有SQL语句全部成功,就需要关闭自动提交功能。
“自动提交”:存在一个系统变量,Autocommit可以对自动提交进行设置。
4、事务操作:
方法一:
show variables like 'autocommit'; #查看自动提交是否开启
set autocommit=1(开启自动提交)
set autocommit=0(关闭自动提交),关闭后,再次执行相应的更新语句发现,在其它连接(会话)中查看数据,没有发生变化,因为结果没有提交。
方法二(提倡):
1)开启事务:start transaction; 关闭自动提交。如果事务结束了,成功或者失败,都会将自动提交机制,回到start时的状态。
2)成功-->提交:commit;
3)失败-->回滚:rollback;
5、重要限制:
存储引擎必须是innodb才能生效。
6、个人理解:
把事务看作一个容器,暂时在该容器(start transaction)中操作(增删改查),如果不出错,就立即更新数据库(commit),即公开可见。如果出错,就立即回滚数据库(rollback),即恢复初始状态,数据库更新停止。
可以高效地防止错误的发生,快速恢复至初始化状态。
7、实验测试:
步骤一:新建两张表,一张是班费表(class),另一张是学生个人钱财表(stu)。
步骤二:开启事务进行数据操作,注意同时开两个数据库窗口,方便我们查看实验效果
窗口1:
此时,可以查看到窗口1中的数据已经更新(我的理解是仅仅是在“事务容器”内更新完成),但是还没有上传至数据库真正更新。在另一个窗口中可见数据库并没有更新成功:
此时,必须在窗口1中的事务中输入commit命令,才能完成真正意义上的更新,无论开多少个窗口,都可以看到数据更新的内容:
如果在“事务容器”中更新数据时出现问题,就需要使用rollback命令立即恢复到初始状态。