📒个人主页:热爱生活的李📒
❤️感谢大家阅读本文,同时欢迎访问本人主页查看更多文章❤️
🙏本人也在学习阶段,如若发现问题,请告知,非常感谢🙏
学会Spring中事务的传播机制 + demo演示
事务的传播,是指一个方法调用另一个方法并将事务传递给它。事务的转播机制主要针对被调用者而言,控制它是否被传播或者被怎样传播。
演示都是基于A 调用 B
A 和 B 事务合并为一个事务 ,有异常两个都回滚
数据库中没有添加 A 数据也没有添加 B 数据
数据库中没有添加 A 数据也没有添加 B 数据
数据库中没有 A 数据也没有 B 数据
数据库中有A 数据 也有 B数据
ps:后面不再演示A 没有异常 + B没有异常,因为没有异常肯定成功了
B 按照有事务运行,A 按照没有事务运行
数据库中有A 数据 没有 B数据
数据库中有 A 的数据 ,没有B 的数据
数据库 A 有数据,B也有数据
相当于新建了一个事务,但是影响关系是不一样的,A 不能影响 B ,但是 B 可以影响 A
数据库中没有 A 数据 也没有 B数据
数据库中有 B数据没有 A数据
数据库中没有 A 数据也没有 B数据
相当于A没有事务 + B使用 REQUIRED级别事务
数据库中没有 A 数据也没有B 数据
数据库没有 A数据也没有 B数据
数据库中没有 A 数据也没有 B数据
与REQUIRED相同
与REQUIRED级别中 A 有事务 类似,A 有事务就加入事务A
相当于 A不使用事务 ,B也不使用事务
数据库中没有数据A但是有数据B
数据库中有数据A没有数据B
数据库中有B数据没有A数据
相当于A没有事务,B也没有事务
相当于A有事务,B使用REQUIRED级别
抛异常,不能运行
抛异常,不能运行
相当于A没有事务,B也没有事务
假设是两个事务
如何是两个事务
那么在我try-catch过后,方法A会执行成功
执行失败,所有required是合并为了一个线程
测试方法同上
结果
执行成功,并且只有数据库中只有A的值没有B的值
结果
数据库中有A没有数据B
REQUIRES_NEW级别下建立了两个连接
NESTED级别下只建立了一个连接
REQUIRES_NEW级别下
打了三个断点
调试过程
到第一个断点
数据库中都没有数据
到第二个断点
数据库中还是没有数据
到第三个断点
methodB方法中的事务以及提交了
而methodA方法中事务还没有提交
运行完毕
数据库中已经有了methodA和methodB方法传入的数据
NESTED级别下
同样地方位置三个断点,只改methodB的事务级别,我把数据库中刚才那两条数据删除了
到第一个断点
数据库中没有A,B方法的数据
到第二个断点
到第三个断点
还是没有数据,但是REQUIRES_NEW级别下已经有B方法的数据了
这会数据库里面没有数据,说明methodB的事务还没有提交
到运行完毕
已经有数据了,说明A、B两方法的事务是同时提交的