📒个人主页:热爱生活的李📒
❤️感谢大家阅读本文,同时欢迎访问本人主页查看更多文章❤️
🙏本人也在学习阶段,如若发现问题,请告知,非常感谢🙏
事务隔离级别+demo理解
学会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级别下都有两个事务的模型
版权归原作者 我叫意志李 所有, 如有侵权,请联系我们删除。