目录✅

  • 1. 事务传播机制定义
    • 1.1 事务传播机制与事务隔离级别区别
  • 2. 7大事务的传播机制
  • 3. Spring 事务传播机制使用和各种场景演示
    • 3.1 支持当前事务(REQUIRED)
    • 3.2 NESTED 嵌套事务
    • 3.3 不支持当前事务(REQUIRES_NEW)
    • 3.4 不支持当前事务,NEVER 抛异常(存在事务,则抛出异常)

1. 事务传播机制定义

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的。

1.1 事务传播机制与事务隔离级别区别

  • 事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的)(横向并列时)
  • 事务传播机制是保证⼀个事务在多个调⽤⽅法间的可控性的(稳定性的)(纵向相互调用时)

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题,如下图所示:

⽽事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题,如下图所示:

2. 7大事务的传播机制

Spring 事务传播机制包含以下 7 种:

  1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。(整体考虑,局部事务出问题,整体都回滚)
  2. Propagation.SUPPORTS:如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。
  3. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。
  4. Propagation.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。
  5. Propagation.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。
  6. Propagation.NEVER:以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。
  7. Propagation.NESTED:如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。(局部考虑,局部事务出问题,只回滚这个局部事务,这个局部事务不会导致整体事务回滚)

以上 7 种传播⾏为,可以根据是否⽀持当前事务分为以下 3 类:

以上分类可以用“情侣”关系来帮助理解:

3. Spring 事务传播机制使用和各种场景演示

关靠以上理论理解事务困难很多,接下来就以实际场景(代码演示)为列来讲解spring事务的传播机制使用,帮助大家更好的理解并正确使用事务的7大传播机制:

3.1 支持当前事务(REQUIRED)

首先在数据库中建立两个表(user表+log表)用户表和日志记录表,来演示事务的传播机制使用:



以及这两个表对应的Java实体类(model):


实现添加用户和添加日志的mapper和xml:
添加用户:


添加日志:


注意在写添加日志SQL时候由于表字段desc与mysql关键字desc冲突,所以要给SQL desc加上 `` 反引号(esc键下面的那个)

此时的代码调用关系如下图:
在controller中的add接口先是调用添加用户的userservice接口,在添加用户完成后调用添加日志的logservice接口(在service层调用mapper来实现SQL操作数据库):

service层代码如下:

此时测试 REQUIRED :
controller层代码:

给service层分别实现添加用户和添加日志的两个方法也加上此传播机制(不加也一样,默认的事务传播机制):

访问接口:(传递用户的姓名和密码)
注意此时数据库中user表只有admin默认这一个记录,日志表为空:


代码不出所料触发了在添加日志代码时的异常:
此时观察控制台:

发现添加用户以及添加日志的SQL均执行成功
但是,观察数据库:

用户表和日志表中依旧没有刚才执行的SQL结果,也就是说事务全部都回滚了!

⽤户表和⽇志表中都没有添加任何数据,说明整个事务都回滚了。也就是说 REQUIRED 如果回滚就是
回滚所有事务,不能实现部分事务的回滚。

总结:加入当前事务 @Transactional(propagation = Propagation.REQUIRED)
当日志添加方法出现异常之后,加入事务的执行结果是:

  • 用户添加成功的数据也跟着回滚了
  • 日志添加数据自然也回滚了

3.2 NESTED 嵌套事务

此时在controller代码中使用嵌套事务:

在service中添加用户和添加日志的方法上也设置嵌套事务:


此时依旧在添加日志时候触发异常使事务回滚:
访问接口:

SQL也是执行成功的:

结果和上面的 REQUIRED 现象是一样的,此时我们观察数据库:

发现user表用户插入成功了,但是日志表日志依旧没有插入成功

总结:
嵌套事务: @Transactional(propagation = Propagation.NESTED)
当日志添加方法出现异常后,嵌套事务的执行结果是:

  • 用户添加不受影响,添加用户成功了,添加用户事务没有回滚
  • 日志添加失败了,发生了异常回滚了日志添加的事务

所以说 required 加入事务,局部事务的失败是影响整体事务的,局部失败导致整体也失败
nested 嵌套事务,局部事务的失败只影响局部事务,只会回滚局部事务,其他事务不会影响

嵌套事务只所以能够实现部分事务的回滚,是因为事务中有⼀个保存点(savepoint)的概念,嵌套事务
进⼊之后相当于新建了⼀个保存点,⽽滚回时只回滚到当前保存点,因此之前的事务是不受影响的,这
⼀点可以在 MySQL 的官⽅⽂档汇总找到相应的资料:savepoint官网文档
(相当于玩单机游戏时候的存单点(保存点savepoint),如果玩家死亡(代码异常)就会自动回到上一个存档点,所以嵌套事务能实现部分事务的回滚)

REQUIRED 是加⼊到当前事务中,并没有创建事务的保存点,因此出现了回滚就是整个事务回滚,这就是嵌套事务和加⼊事务的区别。

总结:嵌套事务(NESTED)和加⼊事务(REQUIRED )的区别:

  • 整个事务如果全部执⾏成功,⼆者的结果是⼀样的。
  • 如果事务执⾏到⼀半失败了,那么加⼊事务整个事务会全部回滚;⽽嵌套事务会局部回滚,不会影
    响上⼀个⽅法中执⾏的结果。

3.3 不支持当前事务(REQUIRES_NEW)

UserController 类中的代码不变,将添加⽤户和添加⽇志的⽅法修改为 REQUIRES_NEW 不⽀持当前事
务,重新创建事务,观察执⾏结果:



注意这里添加日志的代码是先触发异常,再执行添加:

程序执⾏结果:User 表中成功插⼊了数据,Log 表执⾏失败,但没影响 UserController 中的事务。

结论:不管外部⽅法(controller/add)是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法(添加用户和添加日志)会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

3.4 不支持当前事务,NEVER 抛异常(存在事务,则抛出异常)

在service中设置此事务传播机制,则只要调用链中存在事务,就抛出异常,代码也不会执行成功的:


直接抛异常,数据库中也没有相应记录:

  • over ~ ✨

【JavaEE】Spring 事务传播机制相关推荐

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  2. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  3. Spring事务传播机制以及事务嵌套

    Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...

  4. Spring事务传播机制和隔离级别

    Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...

  5. Spring事务传播机制大白话(使用springboot,注解演示)

    1. 我对传播机制的理解 为什么需要传播机制? 因为事务之间可能存在相互调用,例如service业务层的方法存在相互调用,如果相互调用的方法都开启了事务(对应到springboot就是在方法上要添加@ ...

  6. Spring 事务传播机制 实例讲解

    事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...

  7. Spring事务传播机制与隔离机制

    详情查看 https://www.jianshu.com/p/249f2cd42692 转载于:https://www.cnblogs.com/alan319/p/10937089.html

  8. Spring: 事务传播机制

    文章目录 1.美图 2.@Transactional 注解的属性信息 3.案例 3.1 建表 3.2 项目结构 3.3 配置 3.4 config 3.5 实体类 3.5 业务类 3.6 测试类 3. ...

  9. JavaEE进阶 - Spring事务和事务传播机制 - 细节狂魔

    文章目录 1.为什么需要事务?(回顾) 2.Spring 中事务的实现 MySQL 中的事务使用(回顾) 1.⼿动操作事务(编程式事务) 2. 声明式事务(利用注解自动开启和提交事务) @Transa ...

  10. Spring事务与事务传播机制

    目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了,有不了解的可以移步至此篇文章: MyS ...

最新文章

  1. 分享一些 WINDOWS 资源站点(备用)
  2. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
  3. 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......
  4. LeetCode 78. 子集
  5. shell 拿到service状态_9个实战及面试会经常用到的Shell脚本!
  6. 网关、负载均衡、服务注册发现什么关系?
  7. QT学习:基于UDP的网络广播程序
  8. 世纪互联、微软Azure与无穷小微积分
  9. Microsoft Visual Studio 2005中使用水晶报表
  10. Poj 1077 eight(BFS+全序列Hash解八数码问题)
  11. 315.计算右侧小于当前元素的个数
  12. 计算机无法识别打印机usb,USB无法识别打印机的解决方案和教程
  13. 贪吃蛇c加加代码_C语言编写简单贪吃蛇游戏源代码
  14. 升余弦和根升余弦滤波器(SRRC,RRC)的单位脉冲响应
  15. 购买网易企业邮箱后,怎么用手机移动端办公?
  16. 全球及中国铁路行业十四五规划目标与投资建设状况分析报告2021版
  17. UOS系统龙芯架构deb安装包打包实践
  18. ThingsBoard 设备OTA
  19. 综合布线系统中直接与用户终端设备相连的子系统是什么呢?
  20. Windows好用软件

热门文章

  1. 如何成为技术大牛 ?
  2. IT基础架构现代化,未来企业的“标配”是什么?
  3. 幼儿园连锁管理系统源码
  4. iOS 百度地图与高德地图经纬度转换(坐标转换)
  5. vector初始化与清空
  6. 抽象工厂模式简单实例
  7. (附源码)计算机毕业设计ssm电商后台管理系统
  8. SpringBoot 导出Excel 固定表头
  9. 浏览器密码查看工具-WebBrowserPassView使用实验 ——合天网安实验室学习笔记
  10. nginx静态代理设置一:静态文件在本机