Spring事务失效场景
1.非public修饰
Spring事务是通过动态代理实现的,非public修饰的方法不能被代理。
2.用final修饰
final修饰的方法不能被重写
3.自己捕获异常的也不可以
Spring 事务默认仅在抛出未捕获的 RuntimeException 或 Error时回滚。若异常被try-catch捕获且未重新抛出,事务不会回滚。
但是想要捕获其他异常可以自己指定。@Transactional(rollbackFor = NullPointerException.class)
4.异常类型不匹配
若指定了rollbackFor属性,但实际抛出的异常不在指定范围内,事务不会回滚。默认仅回滚RuntimeException和Error, checked 异常(如IOException)不回滚。
5.同一个类方法调用
Spring 事务基于代理实现,同一类内的方法互相调用时,不会经过代理对象,导致事务注解失效。
@Service
public class OrderService {public void createOrder() {// 同一类内调用,updateStatus()的事务不生效this.updateStatus(); }@Transactionalpublic void updateStatus() {// ...}
}
6.数据库不支持事务
7.事务传播行为设置不当
错误的传播行为可能导致事务不生效。例如,PROPAGATION_SUPPORTS(若当前无事务则以非事务方式执行)、PROPAGATION_NOT_SUPPORTED(强制非事务执行)等。