【3】Spring事务管理

一、Spring事务传播机制核心原理

Spring事务传播机制定义了多个带事务的方法相互调用时,事务在方法间的传递规则 ,其底层基于AOP实现:

通过TransactionInterceptor(事务拦截器)在方法执行前后拦截,结合TransactionDefinition(事务定义,包含传播行为、隔离级别等),由PlatformTransactionManager(事务管理器)判断事务的创建、加入、挂起、恢复,最终完成事务的开启、提交或回滚。

二、7种事务传播行为(运营商移动代理商酬金结算业务场景)

传播行为名称 英文标识 核心原理 运营商移动代理商酬金结算业务场景
必需事务 REQUIRED 默认行为;当前有事务则加入,无事务则新建事务 移动代理商月度酬金核算主流程(有事务)调用"计算代理商分润酬金"子方法: 1. 主流程因代理商资质校验失败回滚,分润计算也回滚; 2. 单独调用分润计算时,自动新建事务,保证单代理商分润计算的原子性(避免计算一半数据中断导致脏数据)。
支持事务 SUPPORTS 当前有事务则加入,无事务则非事务执行 酬金核对专员调用"查询代理商酬金明细(含分润、补贴)": 1. 被酬金核算主流程(有事务)调用时,加入事务,保证核对期间明细数据不被修改(避免核对中数据被更新导致结果不一致); 2. 专员单独查询明细时,非事务执行,降低数据库锁开销,提升查询效率。
强制事务 MANDATORY 当前有事务则加入,无事务则抛出IllegalTransactionStateException异常 "确认代理商酬金支付单"方法:该方法必须被酬金核算主流程(有事务)调用,若财务人员单独调用(无事务),直接抛异常,防止"酬金未完成核算但支付单已确认",避免移动公司多付/错付酬金。
新建事务 REQUIRES_NEW 强制新建事务;若当前有事务,先挂起原事务,新事务独立提交/回滚 酬金核算主流程(有事务)调用"记录代理商酬金核算异常日志": 主流程因代理商数据错误回滚时,异常日志事务已独立提交,保证"某代理商酬金核算失败"的痕迹可追溯,便于运营排查问题。
不支持事务 NOT_SUPPORTED 非事务执行;若当前有事务,先挂起原事务,执行完后恢复 酬金核算主流程(有事务)调用"导出全省代理商酬金汇总报表": 导出操作仅读取数据+生成Excel文件,挂起原事务避免长事务占用数据库锁(防止核算主流程阻塞),导出完成后恢复主事务,不影响核算逻辑。
禁止事务 NEVER 非事务执行;若当前有事务,直接抛出IllegalTransactionStateException异常 "代理商酬金数据脱敏查询(供客服查看)"方法: 若被酬金核算主流程(有事务)误调用,直接抛异常,防止事务未提交导致客服查询到未最终确认的酬金数据(如临时核算的未审核金额),避免客服误告知代理商。
嵌套事务 NESTED 当前有事务则创建嵌套事务(基于数据库保存点),无事务则新建事务; 嵌套事务回滚仅回滚到保存点,不影响外层事务;外层回滚则嵌套事务也回滚 批量结算全省地市移动代理商酬金: 主流程(有事务)循环调用"单个地市代理商酬金结算"(嵌套事务): 1. 某地市代理商因绑定的营业厅编码错误结算失败,仅回滚该地市的嵌套事务,主流程继续处理其他地市; 2. 若全省酬金核算参数配置错误导致主流程回滚,所有地市的结算操作均回滚。

三、关键补充

1. 嵌套事务(NESTED)vs 新建事务(REQUIRES_NEW)

  • NESTED是"父子事务":子事务依赖父事务,父事务提交才会最终生效;
  • REQUIRES_NEW是"兄弟事务":新事务完全独立,与原事务无依赖。

2. 选型建议

  • 写操作(如代理商分润计算、酬金支付单确认):优先REQUIRED/REQUIRES_NEW;
  • 读操作(如酬金明细查询、报表导出):优先SUPPORTS/NOT_SUPPORTED;
  • 核心校验操作(如酬金支付单确认):用MANDATORY强制绑定主事务;
  • 敏感查询(如客服用脱敏酬金查询):用NEVER禁止事务执行。
相关推荐
特立独行的猫A24 分钟前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
.痞老板.24 分钟前
mysql初阶--数据类型
android·数据库·mysql
Brookty31 分钟前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
Risehuxyc42 分钟前
MySQL密码插件
数据库·mysql
养军博客1 小时前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
TeamDev1 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA1 小时前
String字符串[面试题]
java·开发语言
腾科IT教育1 小时前
Oracle考试全解析:OCP、OCM认证体系与核心考点备考指南
数据库·oracle·开闭原则
金銀銅鐵11 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
叼烟扛炮11 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php