Nested
如果存在一个事务的话,那么就会开启一个嵌套的事物。这就必须当前有一个事务存在的情况下 ,它才会以一个子事务的框包裹我们的方法 ,那么这就是一种父子事务。是嵌套的。
如果当前没有事务,就和required执行是一样。
所以这里我们只会以一个存在的事务方式去讲解。
子事务和requires_new有区别的。requires_new的话是当前有事务的话会开启一个新的事物,也就是会有两个不同的事务。他们提交的时候也是分别去提交的。
如果是父子事务,嵌套事务的话,它其实是在一起进行提交的。这一点是要区别开来的。
演示
外层用一个父事务,,这里有段异常的代码by.zero
子方法内使用Nested,嵌套事务。并且把异常代码去掉。
清空数据库,执行测试.
数据库内没有数据都回滚了。
父子嵌套事务,主方法里面发生异常,嵌套事务里面的数据是会被回滚的。这一点要注意。
如果我们子方法使用的requires_new 它会开启一个新的事物。
所以当主方法发生了异常的话 ,子方法是不会受影响的。因为requires_new单独开了个事务。
父-required 子-Nested 这样和两边都使用required是一样的。
两边都是required是两边共用同一个事务,发生异常都会回滚。
主方法用requiresd,子方法用nested。只有主方法抛出异常,子方法才会被回滚。也就是主事务发生异常,子事务是要跟着它进行回滚的。
子事务发生异常的情况
子方法用Nested。子方法异常代码开启。
父方法注释异常代码。事务使用required
数据库清空
运行测试
数据库没有任何的内容。
没有被catch会影响到我们的主方法。
可以去给他追加try catch
追加了一个try catch以后。
0
save point。try catch 以后主方法的事物就不受子方法的异常影响了。
如果下面还有其他的操作 例如 delete、update,都不会收到子事务的影响。Nested事务的解决 方式就是用try catch
Nested 总结
如果主事务回滚。子事务可以一起回滚。相反,子事务异常,则父事务可以回滚或者不会滚(就是try catch子事务那种情况。就不回滚。父方法用了catch捕获,就不影响父方法)
7种事务总的
结束