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

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

学会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级别下都有两个事务的模型

在这里插入图片描述

在这里插入图片描述

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值