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

Posted wangjunwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阶段一-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种事务总的

技术图片

结束



 

以上是关于阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-26 详解事务的传播-3的主要内容,如果未能解决你的问题,请参考以下文章

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-20 关于Restful webservice的那些事儿

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

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-14 数据层HikariCP与MyBatis整合

阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-7 PDMan数据库建模工具使用

阶段一-01.万丈高楼,地基首要-第1章 学习指南

阶段一-01.万丈高楼,地基首要-第3章 用户登录注册模块开发-3-12 回顾cookie与session