SpringBoot事务失效场景及排查方法

发布于:2025-09-13 ⋅ 阅读:(21) ⋅ 点赞:(0)

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")` 指定事务管理器。

解决方式: 显式指定事务管理器名称

在这里插入代码片

网站公告

今日签到

点亮在社区的每一天
去签到