SpringBoot事务失效场景及排查方法
1、自调用问题(同类方法调用)
同一类中,方法 A(A没有@Transactional) 调用方法 B(B 有 @Transactional),此时调用的是目标对象的方法,而非代理对象,导致事务未生效。 如果方法A有@Transactional,事务就生效了。解决方式:通过依赖注入代理对象(如注入 UserService
自身)或拆分到不同类中调用
@Override
public void methodA(){
methodB();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void methodB(){
}
2、方法修饰符非 public
Spring 的 AOP 代理默认只能拦截 `public` 方法,非 `public` 方法上的 `@Transactional` 注解会被忽略。
解决方式:将方法改为 public
,或使用 AspectJ 模式增强代理(需额外配置,就是用xml配置事务)
@Override
@Transactional(rollbackFor = Exception.class)
private void method(){
}
3、异常被捕获未抛出
Spring 默认在抛出 RuntimeException或Error时回滚事务。若捕获异常未抛出,或抛出检查型异常(如 `Exception`),事务不会回滚。解决方式:抛出 RuntimeException
或在注解中指定 rollbackFor
4、数据库引擎不支持事务
5、传播机制配置错误
使用 `NOT_SUPPORTED`、`NEVER` 等传播行为会强制方法以非事务运行。解决方式:根据业务需求选择正确的传播行为(如 REQUIRED
)
@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void method() { // 强制非事务执行
// ...
}
6、多数据源未指定事务管理器
多数据源场景下,未通过 `@Transactional(value = "txManagerName")` 指定事务管理器。解决方式: 显式指定事务管理器名称
在这里插入代码片