@Transactional事务失效的原因场景

本文详细列举了事务失效的常见原因,包括未指定回滚异常、异常被捕获、类内部调用、异步多线程、事务传播机制错误、方法修饰符影响以及数据库不支持等,并提供排查事务失效的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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容器托管

总结:

个人暂时知道的就这么多,如有不全欢迎查缺补漏,如果工作中遇到了事务莫名其妙失效了,可以参考上面举例的一一排查

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值