飞道的博客

Spring中事务的传播机制以及REQUIRED、REQUIRES_NEW、NESTED区别以及代码演示

457人阅读  评论(0)

​📒个人主页:热爱生活的李📒
​❤️感谢大家阅读本文,同时欢迎访问本人主页查看更多文章​❤️
🙏本人也在学习阶段,如若发现问题,请告知,非常感谢🙏

学会Spring中事务的传播机制 + demo演示
事务的传播,是指一个方法调用另一个方法并将事务传递给它。事务的转播机制主要针对被调用者而言,控制它是否被传播或者被怎样传播。

演示都是基于A 调用 B

A 有事务, B 使用 REQUIRED 级别

A 和 B 事务合并为一个事务 ,有异常两个都回滚

A 有异常 + B 有异常


数据库中没有添加 A 数据也没有添加 B 数据

A 有异常 + B 没有异常


数据库中没有添加 A 数据也没有添加 B 数据

A 没有异常 + B 有异常

数据库中没有 A 数据也没有 B 数据

A 没有异常 + B 没有异常



数据库中有A 数据 也有 B数据

ps:后面不再演示A 没有异常 + B没有异常,因为没有异常肯定成功了

A 没有事务, B 使用 REQUIRED 级别

B 按照有事务运行,A 按照没有事务运行

A有异常 + B有异常

数据库中有A 数据 没有 B数据

A没有异常 + B有异常


数据库中有 A 的数据 ,没有B 的数据

A有异常 + B没有异常



数据库 A 有数据,B也有数据

A 有事务,B使用REQUIRES_NEW级别

相当于新建了一个事务,但是影响关系是不一样的,A 不能影响 B ,但是 B 可以影响 A

A有异常 + B 有异常

数据库中没有 A 数据 也没有 B数据

A 有异常 + B 没有异常


数据库中有 B数据没有 A数据

A没有异常 + B有异常


数据库中没有 A 数据也没有 B数据

A 没有事务,B使用REQUIRES_NEW级别

相当于A没有事务 + B使用 REQUIRED级别事务

A 有事务,B使用NESTED级别

A有异常 + B有异常



数据库中没有 A 数据也没有B 数据

A 有异常 + B 没有异常



数据库没有 A数据也没有 B数据

A没有异常 + B有异常

数据库中没有 A 数据也没有 B数据

A 没有事务,B使用NESTED级别

与REQUIRED相同

A 有事务,B使用SUPPORTS级别

与REQUIRED级别中 A 有事务 类似,A 有事务就加入事务A

A没有事务,B使用SUPPORTS级别

相当于 A不使用事务 ,B也不使用事务

A有事务,B使用NOT_SUPPORTED级别

A有异常 + B有异常


数据库中没有数据A但是有数据B

A有异常 + B没有异常


数据库中有数据A没有数据B

A没有异常 + B有异常


数据库中有B数据没有A数据

A没有事务,B使用NOT_SUPPORTED级别

相当于A没有事务,B也没有事务

A有事务,B使用MANDATORY级别

相当于A有事务,B使用REQUIRED级别

A没有事务,B使用MANDATORY级别


抛异常,不能运行

A有事务,B使用NEVER级别


抛异常,不能运行

A没有有事务,B使用NEVER级别

相当于A没有事务,B也没有事务

如何确定A有事务,B使用REQUIRED级别时候是合并到一个事务

假设是两个事务

如何是两个事务
那么在我try-catch过后,方法A会执行成功

执行失败,所有required是合并为了一个线程

如何确定A 有事务,B使用REQUIRES_NEW级别时候是两个事务

测试方法同上



结果

执行成功,并且只有数据库中只有A的值没有B的值

如何确定A 有事务,B使用NESTED级别时候是两个事务



结果

数据库中有A没有数据B

如何确定REQUIRES_NEW与NESTED级别下的两个事务的类型不一样

查看建立连接的过程

REQUIRES_NEW级别下建立了两个连接

NESTED级别下只建立了一个连接

打断点看事务提交记录(都没有异常)

REQUIRES_NEW级别下

打了三个断点

调试过程

到第一个断点

数据库中都没有数据



到第二个断点

数据库中还是没有数据


到第三个断点

methodB方法中的事务以及提交了
而methodA方法中事务还没有提交

运行完毕

数据库中已经有了methodA和methodB方法传入的数据

NESTED级别下

同样地方位置三个断点,只改methodB的事务级别,我把数据库中刚才那两条数据删除了

到第一个断点

数据库中没有A,B方法的数据



到第二个断点

到第三个断点

还是没有数据,但是REQUIRES_NEW级别下已经有B方法的数据了
这会数据库里面没有数据,说明methodB的事务还没有提交


到运行完毕

已经有数据了,说明A、B两方法的事务是同时提交的

所以REQUIRES_NEW与NESTED级别下都有两个事务的模型


转载:https://blog.csdn.net/weixin_51538712/article/details/127363760
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场