一文看懂Spring事务传播机制

所谓事务的“传播”指的是多个包含事务的方法互相调用时,事务是如何传播的。

本文首先介绍Spring中的七种事务传播方式,然后针对每一种传播方式举例进行讲解,看完就能完全理解Spring的事务传播机制。

目录

Spring的七种事务传播方式

REQUIRED

例1 内外层都有事务

例2 外层无事务,内层有事务,内层抛错

例3 外层有事务,内层无事务,内层抛错

例4 外层有事务,内层抛错catch

SUPPORTS

例1 内外层有事务,内层抛异常

例2 内外层有事务,内层抛异常,外层try/catch

MANDATORY

例1 外层无事务,直接抛错

例2 外层有事务,内层抛错,外层catch

REQUIRED_NEW

例1 内外层有事务,内层抛错,外层catch

例2 内外层有事务,外层抛错

​NOT_SUPPORTED

例1 外层有事务注解,内层抛错

NEVER

例1 外层有事务,直接抛错

NESTED

例1 内外层有事务,内层抛错 

例2 外层抛错

例3 内层抛错,外层catch


Spring的七种事务传播方式

事务传播行为类型说明
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

链接:https://juejin.cn/post/6844903566205779982

        光看这些枯燥的文字实在难以理解,接下来我会针对每种传播进行举例说明

        首先创建一个简单的数据库表。这个表只有2条数据,分别对应2个用户Tom和Jerry,在初始状态他们各自都有100块。

REQUIRED

        这是Spring默认的事务传播机制,也就是当我们在某一个方法上直接使用@Transaction注解的时候,默认的使用此种事务传播。下面举例说明。

例1 内外层都有事务

         篮框的方法updateMoney1作为外层方法,首先去更新Tom的余额,然后调用绿框中的updateJerryMoney1内层方法,尝试更新Jerry的余额。两个方法都使用了@Transaction注解。让内层方法主动抛出异常。(特别提醒,因为两个方法在一个类中,为了让事务生效,需要将类再次注入进来,如红框所示)

        调用controller接口:

        接口抛错:

        结果:查看数据库中数据,余额均回滚。

        解析:外层方法和内层方法都在一个事务中,内层方法抛错后,两个方法均会回滚。 

例2 外层无事务,内层有事务,内层抛错

        结果:外层提交内层回滚。

        解析:因为外层无事务,只有内层有事务,内层抛错只会回滚内层事务。

例3 外层有事务,内层无事务,内层抛错

        结果:内外层均回滚

        解析:虽然内层没有加事务,但确实触发了事务。这里如果不想让内层方法跟着回滚,可以在内层使用NOT_SUPPORTED传播。如果这里换成外层抛错,还是内外层均回滚。原理一样。

例4 外层有事务,内层抛错catch

        结果:内外层均提交。

        解析:因为错误没有抛出,事务未触发。

SUPPORTS

        见名知意,如果有事务就加入,否则不开启事务。

例1 内外层有事务,内层抛异常

        结果:内外层均回滚。       

        解析:内外层在同一个事务中,异常导致二者均回滚。

例2 内外层有事务,内层抛异常,外层try/catch

        结果:内外层均回滚。 

        解析:这里需要注意,内层已经触发了事务,因为内外层在同一个事务中,即便外层catch了异常,依旧会一起回滚。

MANDATORY

        强制要求必须有事务,不然抛错。

例1 外层无事务,直接抛错

例2 外层有事务,内层抛错,外层catch

        结果:内外层均回滚。

        解析:即便外层catch了异常,但是内外层在同一事务中,依旧会回滚。

REQUIRED_NEW

例1 内外层有事务,内层抛错,外层catch

        结果:外层提交,内层回滚。

        解析:内外层分别在各自的事务中,互不干预,内层触发事务则内层回滚。外层catch了异常未抛出,则不会触发事务。如果外层没有catch,则外层也会回滚,不过需要注意的是这里是2个事务。

例2 内外层有事务,外层抛错

        结果:外层回滚,内层提交。

        解析:外层触发事务回滚,不影响内层。

NOT_SUPPORTED

        非事务方式执行,不管当前在不在事务中。

例1 外层有事务注解,内层抛错

        结果:外层回滚,内层提交。

        解析:内层不支持事务,即便抛错也不回滚;抛错到外层,外层触发事务,回滚。

NEVER

        和mandatory相反,如果当前存在事务则抛出异常。

例1 外层有事务,直接抛错

 

NESTED

         当前有事务则嵌套事务,也就是创建一个子事务;当前没事务则和Required相同。这应该是最让人迷惑的事务传播了。

例1 内外层有事务,内层抛错 

        结果:内外层均回滚 。

        解析:看起来和required_new是一样的。这里要注意,经常看到一种说法是子事务不影响父事务,这样说是不严谨的。内层事务抛异常,触发内层事务回滚,异常又被外层捕获,再次触发事务回滚。

例2 外层抛错

        结果:内外层均回滚。

        解析:主事务会影响嵌套的子事务,二者均回滚。这和Required_new是不一样的。

例3 内层抛错,外层catch

        结果:外层提交,内层回滚。

        解析:内层的嵌套子事务在这种情况下不会影响外层。注意这里和Required是不同的,required的话外层也会回滚。 

Gitee代码链接在此  SpringTransactionPropagation: Spring事务传播示例

艾-普-西-隆
关注 关注
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring事务传播机制
m0_67393342的博客
07-28 585
1)特性A、当前存在事务,加入;B、当前不存在事务,新开启一个事务。(2)提交外层事务提交了,内层才会提交(3)回滚因为是一个事务,内/外只要有报错,他俩会一块儿回滚。
猿蜕变16——一文Spring事务花式玩法
hzldds2019的博客
06-12 196
看过之前的蜕变系列文章,相信你对事务有了应用方面的认识。但是这些要完成你的蜕变还不够,考虑到大家的基础知识,我们继续回到spring的话题上来,我们一起聊一聊Spring事务中的花式玩...
Spring事务传播机制
最新发布
qq_44286009的博客
08-25 912
Spring事务传播机制是指在一个事务方法调用另一个事务方法时,Spring如何管理这些方法之间的事务边界。Spring在接口中定义了七种事务传播行为,以满足不同的业务需求。
spring 事务传播机制
chila5262的博客
11-30 97
事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择。 PROPAGATION_...
Spring 事务传播机制
这个人很懒, 什么都没留下(这是我写的)
06-18 4449
Spring 事务传播机制演示, 包含 REQUIRED、REQUIRES_NEW 以及嵌套式事务详解
SpringSpring的7种事务传播机制讲解,以及49种组合方式介绍
zxy2361380031的博客
03-09 8398
Spring的7种事务传播机制讲解,以及49种组合方式介绍
一文 Spring WebFlux 的来龙去脉
m0_38017860的博客
08-29 2420
概述 本文将通过对 Reactive 以及相关概念的解释引出 Spring-WebFlux,并通过一些示例向读者解释 基于 Spring-WebFlux 如何进行反应式编程实践,同时会讨论相关技术的优缺点及技术原理。 什么是 Reactive 在计算机编程领域,Reactive 一般指的是 Reactive programming。指的是一种面向数据流并传播事件的异步编程范式(asynchronous programming paradigm) 响应式编程最初是为了简化交互式用户界面的创建和实时系统动画的绘
spring总结,从底层源码角度概括,一文打通spring任督二脉
java_spring6的博客
06-22 365
Spring是一个开源框架,Spring是一个轻量级的Java 开发框架。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Sp
一文SpringBoot中的事务管理
CXY_QIQI的博客
05-28 1211
什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态。 事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分..
一文让你搞Spring的统一事务模型
02-05 586
Spring事务的知识体系 进入主题之前,先来了解一下Spring事务,都有哪些内容: Spring事务包含对分布式事务和单机事务的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。 单机事务,按照用法分,又可以分为编程式事务模型(TransactionTemplate)和声明式事务模型(@Transactional注解),后者可以理解为 aop + 编程式事务模型。 编程式事务模...
Spring的7种事务传播机制
热门推荐
dayuiicghaid的博客
06-13 2万+
什么是事务事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。对数据库的增删改查操作传播机制是什么? 当A调用B的时候,两个事务是怎么运行的?A出现异常,或者B出现异常,A回不回滚,B回不回滚?还是A回滚,B不回滚?这些问题事务 以非事务性方式运行是什么意思? 非事务的方式运行,其实就是设置为自动提交了,如果一个方法中有多个操作,则每个操作都会在不同事务中完成,不会保证他们的原子性。事务挂起是什么意思? 在方法A开始运行时,
Spring事务传播机制
crazy_xieyi的博客
05-16 1592
本文主要介绍了事务传播机制,以及演示了嵌套事务(NESTED)和加⼊事务(REQUIRED )的场景,最后总结了他们各自的区别。
spring事务---传播机制
Berg的学习历程
07-13 193
使用: @Transactional(propagation=Propagation.REQUIRED) 说明: 事务传播行为 说明 REQUIRED 当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务(默认情况) SUPPORTS 当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行 MANDATORY 该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 REQUIRES_NEW 当前方法必须运行在
spring事务传播机制
诗水人间
04-16 292
spring事务传播机制是常考的一个考点。 在考spring事务传播机制前,我希望你已经掌握了数据库的事务隔离级别。 数据库事务的理解 MySQL数据库事务的理解 spring中的事务传播机制 在谈spring事务传播机制,“传播”这个词实际上就暗示了讲的就是多个数据库事务之间的关系。 这个考点考的就是考 事务事务之间的关系(假设有事务A和事务B两个事务) 而所谓事务无非就是异常回滚 只不过呢,事务A和事务B可能出现互相调用的问题,例如事务A调用事务B,那么A出异常或者B出异常后到底该怎么处理,是一起回
Spring 事务传播机制
FangHX25的博客
07-13 1060
Spring事务传播机制、隔离级别和回滚策略
Spring 事务传播机制
霖林烟雨
12-16 1901
简述: spring事务(transaction)分为
spring事务传播机制
zhushanzhi的专栏
10-02 186
spring事务传播机制 1 propagation_required 支持当前事务,如果当前不存在事务,则新建一个事务 2 propagation_requires_new 不论当前有没有事务,直接新建一个事务 3 propagation_support 支持当前事务,如果当前存在事务,则加入该事务,如果不存在,就以非事务方式执行 4 propagation_mandatory 支持当前事务,如果当前存在事务,则加入该事务,如果不存在,则抛出异常 5 propagation_not_support 以非事
一文 spring bean 生命周期
10-08
Spring Bean 的生命周期是指在 Spring 容器中创建和管理一个 Bean 的整个过程。对于 singleton bean,它的生命周期可以分为以下几个阶段: 1. 实例化(Instantiation):在这个阶段,Spring 会根据配置信息实例化一个 Bean 对象。通常情况下,Spring 使用无参构造函数来创建对象。 2. 属性赋值(Populate properties):在实例化之后,Spring 会通过依赖注入或自动装配的方式将配置的属性值注入到 Bean 中。 3. 初始化(Initialization):在属性赋值之后,Spring 会调用 Bean 的初始化方法来进行一些特定的初始化操作。可以通过在配置文件中使用 init-method 属性来指定初始化方法。 4. 使用(In use):在初始化之后,Bean 就可以被使用了,业务逻辑可以对其进行操作。 5. 销毁(Destruction):当容器关闭或者手动销毁 Bean 时,Spring 会调用 Bean 的销毁方法来进行一些资源释放等清理工作。可以通过在配置文件中使用 destroy-method 属性来指定销毁方法。
写文章

热门文章

  • redis分布式锁及秒杀系统实战 11072
  • flowable自定义属性添加 8370
  • springboot自定义工具类构建打包踩坑经历 5863
  • GeoWebCache配置方法 5047
  • Mysql乐观锁实战 4825

分类专栏

  • Python 1篇
  • 爬虫 1篇
  • 微博模拟登录 1篇
  • springboot 2篇
  • 缓存 1篇
  • ehcache 1篇
  • redis 1篇
  • 并发 1篇
  • jQuery 1篇
  • JavaScript 1篇
  • OpenLayers 2篇
  • PHP 3篇
  • GeoServer 3篇
  • MySql 2篇

最新评论

  • Python爬虫-Weibo模拟登录及crawling

    你转转你那脑子吧: 好呢好呢表情包

  • Python爬虫-Weibo模拟登录及crawling

    艾-普-西-隆: 第一次是的。因为微博登陆强制要求输入验证码或私信或扫码。其实和微信差不多:都是手机端应用,登陆都需要用到手机。

  • Python爬虫-Weibo模拟登录及crawling

    艾-普-西-隆: 这个文章写在2021年,现在已经不适用了。表情包

  • Python爬虫-Weibo模拟登录及crawling

    你转转你那脑子吧: 博主你好,最近微博政策有新的变化,登录需要按顺序点击对应图片,这个还能用一般的方法实现吗?

  • Python爬虫-Weibo模拟登录及crawling

    csdn565973850: 我看到你的模拟登录还是需要手动输入短信验证码或者手动点击APP推送消息,这样还算是模拟登录吗。在程序跑的时候还要自己时刻关注手机等着输入验证码吗

最新文章

  • 若依框架学习-springboot-gateway笔记
  • WARNING: IPv4 forwarding is disabled. Networking will not work.
  • SonarQube安装踩坑记录
2024年2篇
2023年7篇
2022年7篇
2021年2篇
2020年1篇
2018年14篇
2017年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家厦门广场玻璃钢雕塑价格吉林仿铜玻璃钢雕塑大型商场整体美陈商场柜台新年美陈邵阳火烈鸟玻璃钢雕塑定做尚志玻璃钢大门雕塑青浦区玻璃钢雕塑要多少钱安阳标牌标识玻璃钢卡通雕塑平顶山玻璃钢雕塑价格玻璃钢花盆种什么漯河玻璃钢雕塑价格公园摆件玻璃钢人物雕塑保山市玻璃钢雕塑设计批发重庆玻璃钢雕塑加工厂家招远玻璃钢卡通座椅雕塑城市标志玻璃钢雕塑厂家玻璃钢雕塑反光图片公园玻璃钢雕塑定做喀什商场美陈陕西欧式玻璃钢雕塑销售厂家抛售玻璃钢动物雕塑商场美陈布置合同豫莲花玻璃钢雕塑四大天王图片济南动物玻璃钢雕塑哪家便宜福建卡通玻璃钢雕塑景观装饰舟山大型玻璃钢雕塑生产厂家呼伦贝尔景观玻璃钢雕塑日式玻璃钢花盆晋城公园不锈钢校园玻璃钢雕塑运城锻铜玻璃钢景观雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化