我们这节研究事务中两个不是很重要的问题,可能在开发比较复杂的程序时会用到,那就是嵌套事务和rollback影响自增长。
嵌套事务
什么是嵌套事务?看图:
在一个事务中又出现一个或多个事务,这种现象就是嵌套事务。
这样的情况在开发程序时是有可能出现的。在开发一个复杂的系统时难免会无意中在事务中嵌套了事务,比如A函数调用了B函数,A函数使用了事务,并且是在事务中调用了B函数,B函数也有一个事务,这样就出现了事务嵌套。
首先说明一点,MySQL不支持事务嵌套。当执行一个START TRANSACTION或begin指令时,会隐式的执行一个commit操作。
还好MySQL有一个功能可以实现类似的嵌套功能:
折返点
SAVEPOINT 折返点名
ROLLBACK TO SAVEPOINT 折返点名
做下演示:
这是一张空表
分析:
1)开启一个事务
2)在事务中插入一条记录
3)设置折返点出错,所以说折返点名不能是纯数字
4)设置折返点“trans1”成功。
5)插入一条数据。
6)返回到折返点“trans1”。
7)提交事务
我们看下最终结果:
只插入了一条数据。
总结:有了这个折返点功能,在项目中再配合PHP逻辑代码就能模拟出事务嵌套的功能。
rollback语句会影响到自增长
我们继续上面的演示:
在commit之后楠神又插入一条数据,大家是不是觉得“id”字段此时的值是2?其实不是:
直接是3。
为什么这样?
insert into `tt` (`vid`) values(2);虽然没有最终写入到硬盘,但自增长字段取值还是被它加一了。
在不同的session事务之间,rollback照样会影响自增长字段取值。
总结:这个问题对项目影响不大,只是说有些人更喜欢数据变得严谨些。比如说这是个会员表,只需要查看最后一个会员的ID号就能知道总共有多少会员,不需要count()了。如果中间添加会员时有rollback,这样统计会员数就不正确了。