阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-26 详解事务的传播-3

Nested

如果存在一个事务的话,那么就会开启一个嵌套的事物。这就必须当前有一个事务存在的情况下 ,它才会以一个子事务的框包裹我们的方法 ,那么这就是一种父子事务。是嵌套的。

如果当前没有事务,就和required执行是一样。
所以这里我们只会以一个存在的事务方式去讲解。

子事务和requires_new有区别的。requires_new的话是当前有事务的话会开启一个新的事物,也就是会有两个不同的事务。他们提交的时候也是分别去提交的。

如果是父子事务,嵌套事务的话,它其实是在一起进行提交的。这一点是要区别开来的。

演示

外层用一个父事务,,这里有段异常的代码by.zero

子方法内使用Nested,嵌套事务。并且把异常代码去掉。

清空数据库,执行测试.
数据库内没有数据都回滚了。


父子前天事务,主方法里面发生异常,嵌套事务里面的数据是会被回滚的。这一点要注意。

如果我们子方法使用的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子事务那种情况。就不回滚。)

7种事务总的

结束



 

猜你喜欢

转载自www.cnblogs.com/wangjunwei/p/12051408.html