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

【Spring】声明式事务传播机制

1. 所有传播行为

  1. REQUIRED(默认类型)
    • 如果当前存在事务,则加入该事务;如果没有,则新建一个事务。
    • 适用于大多数业务场景。
  1. SUPPORTS
    • 如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。
    • 适合可选的事务场景。
  1. MANDATORY
    • 如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。
    • 用于必须在一个事务中执行的场景。
  1. REQUIRES_NEW
    • 创建一个新事务;如果当前存在事务,则挂起当前事务。
    • 适用于需要与当前事务独立的情况。
  1. NOT_SUPPORTED
    • 以非事务方式执行;如果当前存在事务,则挂起当前事务。
    • 适合不需要事务的执行场景。
  1. NEVER
    • 不使用事务;如果当前存在事务,则抛出异常。
    • 用于明确不允许事务的场景。
  1. NESTED
    • 如果当前存在事务,则在嵌套事务中执行;否则与REQUIRED相同。
    • 适用于需要支持部分回滚的场景。

2. REQUIRED,REQUIRES_NEW,NESTED异同


NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚。而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。


NESTED和REQUIRES_NEW都可以做到内部方法事务回滚而不影响外围方法事务。但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。

3. 事务不生效的原因

spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了!常见情况有

如下几种

1、发生自调用,类里面使用this调用本类的方法(this通常省略),此时这个this对象不是代理类,而是

UserService对象本身!解决方法很简单,让那个this变成UserService的代理类即可!

2、方法不是public的:@Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在

非 public 方法上,可以开启 AspectJ 代理模式。

3、数据库不支持事务

相关文章:

  • 【Go】go语言指针
  • 表达式引擎之通用的开屏页后端接口设计
  • 需要使用新应用以打开此ms-gamingoverlay链接怎么解决
  • 【FPGA】——实现六位流水灯
  • Oracle底层原理解析
  • JS | JS中的日期和时间的获取方法
  • 二阶近似 是什么意思
  • Web开发-PHP应用文件操作安全上传下载任意读取删除目录遍历文件包含
  • 字符串p型编码(信息学奥赛一本通-1145)
  • 理解我们单片机拥有的资源
  • 【操作系统安全】任务4:Windows 系统网络安全实践里常用 DOS 命令
  • linux系统——创建swap分区和移除磁盘
  • ftp替代品,如何提升数据交换的安全性与高效性?
  • css3有哪些新属性
  • 它,让机器人与HMI屏无缝对接
  • STM32输入捕获采集超声波模块HC-SR04响应的高电平
  • 问deepseek: 如何处理CGNS网格文件里,多个zone之间的链接数据
  • Java:引用其他类的方法
  • 09-ArcGIS For JavaScript -- 基于ThreeJS实现动态GLTF模型加载
  • 如何在AI时代处理 PDF
  • 启程回家!神十九轨道舱与返回舱成功分离
  • 广东省副省长刘红兵任湖南省委常委、宣传部部长
  • 中国人保聘任田耕为副总裁,此前为工行浙江省分行行长
  • 邮储银行一季度净赚超252亿降逾2%,营收微降
  • 船只深夜撞上海上风机后沉没1死1失踪,调查报告公布
  • 国家发改委答澎湃:将建立和实施育儿补贴制度,深入实施提振消费专项行动