跳到主要内容

Spring 事务失效的 8 种场景

📺 配套视频

📝 知识点总结

8 种事务失效场景

#场景原因解决方案
1方法不是 publicSpring AOP 只能代理 public 方法改为 public
2自调用(this 调用)绕过了代理对象,直接调用目标方法注入自身 / AopContext.currentProxy()
3异常被 catch 吞掉Spring 感知不到异常,不会回滚抛出异常或手动 setRollbackOnly()
4抛出非 RuntimeException默认只回滚 RuntimeException@Transactional(rollbackFor = Exception.class)
5数据库引擎不支持事务MyISAM 不支持事务使用 InnoDB
6没有被 Spring 管理类没加 @Service/@Component确保 Bean 在容器中
7传播行为设置错误REQUIRES_NEW 内层事务独立提交根据业务选择正确的传播行为
8多线程调用事务绑定在 ThreadLocal 上,新线程无事务避免在事务方法中开新线程

最容易踩坑的:自调用

@Service
public class OrderService {

// ❌ 事务不生效!this 调用绕过了代理
public void createOrder() {
this.saveOrder(); // 直接调用,不走代理
}

@Transactional
public void saveOrder() {
// 数据库操作
}
}
@Service
public class OrderService {

@Autowired
private OrderService self; // 注入代理对象

// ✅ 通过代理对象调用,事务生效
public void createOrder() {
self.saveOrder();
}

@Transactional(rollbackFor = Exception.class)
public void saveOrder() {
// 数据库操作
}
}

🔗 延伸阅读