事务回滚不生效需排查异常类型、代理机制、传播行为、数据源绑定及日志验证:确保抛出runtimeexception或显式配置rollbackfor;避免self-invocation;检查传播行为是否为非事务性;确认transactionmanager匹配数据源;通过debug日志验证事务实际执行。

事务回滚不生效,不是代码写了 @Transactional 就万事大吉。它背后涉及 Spring 代理机制、异常类型、传播行为、数据源绑定等多个关键环节。很多问题表面是“没回滚”,实际是“根本没进事务”或“被静默吞掉了”。下面从高频场景出发,给出可立即上手的排查路径。
检查异常是否被“吃掉”或非运行时异常
Spring 默认只对 未被捕获的 RuntimeException 及其子类 回滚。如果方法里 try-catch 了异常但没重新抛出,或者抛出的是 Exception(如 IOException),事务就不会触发回滚。
- 确认抛出的异常继承自
RuntimeException;若必须用检查型异常,需显式声明:@Transactional(rollbackFor = Exception.class) - 检查业务代码中是否有
try {...} catch {...}块——尤其是空 catch 或仅打日志后就返回,这会让事务“以为一切正常”
确认事务方法是否被 Spring 正确代理
@Transactional 依赖 Spring AOP 代理生效。如果调用发生在同一个类内部(self-invocation),比如 A 方法调用本类的 B 方法,B 上的 @Transactional 会完全失效,因为绕过了代理对象。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 确保事务方法是被 Spring 容器管理的 Bean,并通过接口/代理方式调用(即:外部 Bean 调用该方法)
- 避免在同一个类中直接
this.method()调用带事务的方法;可改为注入自身 Bean 或使用AopContext.currentProxy()(需开启expose-proxy="true")
验证事务传播行为是否符合预期
默认传播行为是 REQUIRED,但如果上游方法已存在事务,而当前方法配置为 SUPPORTS 或 NOT_SUPPORTED,它就不会开启新事务,自然也谈不上回滚。
- 检查方法上是否误加了
@Transactional(propagation = Propagation.SUPPORTS)等非事务性传播类型 - 特别注意工具类或异步方法(
@Async)——它们默认不在主事务上下文中,需单独配置事务或手动管理
排查数据源与事务管理器是否匹配
当项目使用多数据源(如 @DS 切换)时,@Transactional 默认绑定的是主数据源事务管理器。如果方法操作的是从库,但事务注解没指定对应管理器,就会出现“事务开启成功,但回滚对从库无效”的假象。
- 确认
@Transactional是否指定了正确的transactionManager,例如:@Transactional(transactionManager = "toolDbTransactionManager") - 检查
@DS和@Transactional的执行顺序——部分动态数据源框架要求事务注解必须在数据源切换之后生效,否则可能绑定错连接
观察日志确认事务是否真正开启和回滚
光看代码容易误判。打开 Spring 的事务日志,让执行过程“说话”:
- 在
application.yml中添加:
logging.level.org.springframework.transaction=DEBUG
logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=TRACE - 启动应用,复现问题流程,搜索日志中的
Creating new transaction、Initiating transaction rollback、Committing JDBC transaction等关键词 - 如果没有看到事务开启日志,说明事务根本没进来;如果看到 rollback 日志但数据库没变,大概率是数据源或连接未参与该事务
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










