第十章:第23节 MySQL进阶篇——InnoDB事务的嵌套和rollback影响自增长取值

更新于:2017-09-14 15:34:23

我们这节研究事务中两个不是很重要的问题,可能在开发比较复杂的程序时会用到,那就是嵌套事务和rollback影响自增长。


嵌套事务


什么是嵌套事务?看图:


1.png


在一个事务中又出现一个或多个事务,这种现象就是嵌套事务。


这样的情况在开发程序时是有可能出现的。在开发一个复杂的系统时难免会无意中在事务中嵌套了事务,比如A函数调用了B函数,A函数使用了事务,并且是在事务中调用了B函数,B函数也有一个事务,这样就出现了事务嵌套。


首先说明一点,MySQL不支持事务嵌套当执行一个START TRANSACTION或begin指令时,会隐式的执行一个commit操作。


还好MySQL有一个功能可以实现类似的嵌套功能:


折返点


SAVEPOINT 折返点名


ROLLBACK TO SAVEPOINT 折返点名


做下演示:


1.png


这是一张空表


1.png


分析:


1)开启一个事务

2)在事务中插入一条记录

3)设置折返点出错,所以说折返点名不能是纯数字

4)设置折返点“trans1”成功。

5)插入一条数据。

6)返回到折返点“trans1”。

7)提交事务


我们看下最终结果:


1.png


只插入了一条数据。


总结:有了这个折返点功能,在项目中再配合PHP逻辑代码就能模拟出事务嵌套的功能。


rollback语句会影响到自增长


我们继续上面的演示:


1.png


在commit之后楠神又插入一条数据,大家是不是觉得“id”字段此时的值是2?其实不是:


1.png


直接是3。


为什么这样?


insert into `tt` (`vid`) values(2);虽然没有最终写入到硬盘,但自增长字段取值还是被它加一了。


1.png


1.png


在不同的session事务之间,rollback照样会影响自增长字段取值。


总结:这个问题对项目影响不大,只是说有些人更喜欢数据变得严谨些。比如说这是个会员表,只需要查看最后一个会员的ID号就能知道总共有多少会员,不需要count()了。如果中间添加会员时有rollback,这样统计会员数就不正确了。