@Transactional事务失效的场景
工作中@Transactional经常被使用到,如果出现了事务失效时,可能会一头雾水,事务失效的原因还是有非常多的,本人主要列举以下几点
1.未指定回滚异常
Transactional注解默认的回滚异常类型是运行时异常(RuntimeException)
如果遇到是非RuntimeException,就不会回滚。
2.异常被捕获
当抛出的异常被try-catch捕获时,事务也会失效.
3.类内部直接调用
- 如果在一个类内部通过方法名来调用一个事务方法的话,事务会失效.
- 在别的类调用
- AopContext.currentProxy() 获取代理对象
4.异步多线程,事务方法内部新开一个线程
Spring事务管理器底层是通过ThreadLocal的原理来管理事务的,无法控制跨线程之间的事务一致性。
5.使用了错误的事务传播机制
传播机制 | 作用 |
---|---|
PROPAGATION_REQUIRED | 有就加入,没有就新建 |
PROPAGATION_SUPPORTS | 有就就如,没有就非事务 |
PROPAGATION_MANDATORY | 强制,没有事务就抛异常 |
PROPAGATION_REQUIRES_NEW | 有没有都创建新事务 |
PROPAGATION_NOT_SUPPORTED | 非事务运行,有事务就把事务挂起 |
PROPAGATION_NEVER | 有事务直接抛异常 |
PROPAGATION_NESTED | 有事务就内嵌,没有就创建一个新的 |
6.方法被private或者final,static修饰
7.数据库不支持事务,存储引擎
8.当前类没有被Spring容器托管
总结:
个人暂时知道的就这么多,如有不全欢迎查缺补漏,如果工作中遇到了事务莫名其妙失效了,可以参考上面举例的一一排查