当前位置: 首页 > 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、数据库不支持事务

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

相关文章:

  • 【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
  • RabbitMQ 全面详解(附面试重点)
  • 【第15届蓝桥杯】软件赛CB组省赛
  • 微服务存在的问题及解决方案
  • Docker基础知识介绍
  • 基于SpringBoot+Vue的电商应用系统的设计与实现(代码+数据库+LW)
  • 【Linux系列】文件压缩
  • 深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发
  • golang-struct结构体
  • C3P0数据库连接池技术详解及实战
  • Node.js系列(1)--架构设计指南