当前位置: 首页 > news >正文

Spring事务传播行为?失效情况?(详解)

事务传播行为指的就是当一个事务方法被另一个事务方法调用时这个事务方法应该如何进行。

Spring中有七种事务的传播行为,分别是:required、requires_new、supports、not_supported、nested、mandatory、never

required

如果当前没事务,就新建一个事务;如果已经存在事务,则加入该事务

外围A方法,内围B、C方法required

  • A方法无事务(外围方法无事务,内围方法独立回滚,互不干扰)

    • A方法抛出异常,B、C不会回滚

    • C方法抛出异常,C单独回滚,A、B不会回滚

  • A方法有事务 (内外围方法属于同一个事务,一个回滚,全部回滚)

    • A方法抛出异常,A回滚,B、C也回滚

    • C方法抛出异常,C回滚,A感知到异常,A回滚,B也回滚

    • C方法抛出异常并被Acatch,C回滚,A未感知异常,但A、B、C同事务,A回滚,B也回滚

required_new

新建事务

外围A方法,内围B、C方法required_new

  • A方法无事务(外围方法无事务,内围方法独立回滚,互不干扰,同required外围方法无事务)

    • A方法抛出异常,B、C不会回滚

    • C方法抛出异常,C单独回滚,A、B不会回滚

  • A方法有事务 (内围方法之间、内外围方法之间均相互独立,互不干扰,除非内围方法抛出异常被外围方法感知到)

    • A方法抛出异常,B、C不会回滚

    • C方法抛出异常,C回滚,A感知到异常并抛出,A回滚,B不回滚

    • C方法抛出异常并被Acatch,C回滚,A未感知异常,A不回滚,B不回滚

nested

如果当前没有事务,就新建一个事务;如果已经存在事务,则作为该事务的子事务

外围A方法,内围B、C方法nested

  • A方法无事务(外围方法无事务,内围方法独立回滚,互不干扰,同required外围方法无事务)

    • A方法抛出异常,B、C不会回滚

    • C方法抛出异常,C单独回滚,A、B不会回滚

  • A方法有事务 (外围方法回滚,内围方法全部回滚;内围方法回滚,不影响外围方法和其他内围方法,除非内围方法抛出的异常被外围方法感知到)

    • A方法抛出异常,A回滚,B、C是A的子事务,B、C回滚

    • C方法抛出异常,C回滚,A感知到异常并抛出,A回滚,B是A的子事务,B回滚

    • C方法抛出异常并被Acatch,C回滚,A未感知异常,A不回滚,B不回滚

注意:如果C方法产生的异常被C自身catch,则C方法即使加了事务,也不会回滚!这是事务失效的一个场景。

  • support支持当前事务,如果当前没事务,则无事务运行

  • mandatory使用当前事务,如果当前没事务,则抛出异常

  • not_support不支持事务,如果当前有事务,则不使用

  • never不支持事务,如果当前有事务,则抛出异常

事务传播行为有什么用?

主要作用就是:控制事务边界

PROPAGATION NESTED来举例。如果外层事务失败,则会回滚内层事务,内层事务失败不影响外层事务。

可以发现,外层事务失败会影响到内层事务,即外层到内层之间是没有边界的,但内层失败则不影响外层,说明内层往外层之间事务是有边界的,使得影响无法传播出去。

事务传播行为可以帮助处理错误情况,灵活的选择回滚整个事务或仅回滚当前方法的事务

Spring 事务在什么情况下会失效?

一般而言失效的情况都是用了声明式事务即 @Transactional注解

  1. 由于Spring的事务是基于AOP的方式结合动态代理来实现的。因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强。

  2. 若没有正确地设置@Transactional注解中的rollbackFor属性,那么只有当抛出RuntimeExceptionError时,事务才会回滚。

  3. 如果事务代码抛错,但是被捕获了,但仅仅记录了日志,这样事务无法正常获取到错误,因此不会回滚。

  4. 非事务方法调用事务方法,是不会走代理的,因为事务是基于动态代理实现的

  5. 事务传播行为不对

  6. 没有被Spring管理

http://www.dtcms.com/a/263823.html

相关文章:

  • 设计模式精讲 Day 20:状态模式(State Pattern)
  • imx6ull芯片中断机制6.24-6.25
  • Python中字符串isalpha()函数详解
  • 设计模式-责任链, 责任链+ 模板方法模式相结合
  • 抽奖概率-数值练习题
  • AR衍射光波导设计遇瓶颈,OAS 光学软件来破局
  • 【Golang面试题】Go结构体的特点,与其它语言的区别
  • 学习昇腾开发的第11天--主要接口调用流程
  • 逐步构建高性能http服务器及聊天室服务器
  • 青否数字人直播再创新纪录!“人工智能+消费”开新篇?zhibo175
  • ABB CH-3185 3 bhl 000986 p 1006 ab ability 800 xa自动化系统
  • 【V6.0 - 听觉篇】当AI学会“听”:用声音特征捕捉视频的“情绪爽点”
  • 【开源项目】一款真正可修改视频MD5工具视频质量不损失
  • 【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(3)决策树回归模型(Decision Tree Regression)
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • Python 单例模式与魔法方法:深度解析与实践应用
  • MySQL允许root用户远程连接
  • PDFBox + Tess4J 从PDF中提取图片OCR识别文字
  • 探秘阿里云Alibaba Cloud Linux:云时代的操作系统新宠
  • C语言学习笔记:深入解析结构体数组(附代码实践)
  • Qt QTableWidget多行多列复制粘贴
  • Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
  • 安全左移(Shift Left Security):软件安全的演进之路
  • Spring Boot 2 多模块项目中配置文件的加载顺序
  • 智能交通信号灯
  • Django打造智能Web机器人控制平台
  • HarmonyOS应用开发高级认证知识点梳理 (三)状态管理V2装饰器核心规则
  • android车载开发之HVAC
  • 笔记本电脑怎样投屏到客厅的大电视?怎样避免将电脑全部画面都投出去?
  • 【蓝牙】Linux Qt4查看已经配对的蓝牙信息