spring事务失效场景梳理
- @Transactional 应用在非 public 方法上
spring 事务底层在扫描 @Transactional 注解时会直接不会获取非 public 的方法上的 @Transactional 注解的属性信息
- @Transactional 的 rollbackFor 设置
- 默认不设置的话,在 Error 和 RunTimeException 错误时会触发事务,其他异常不会;
- rollbackFor 指定异常类型,则只会在该异常类型出现时触发事务;
- 同一个类中的方法调用
同一个类中,methodA 没有设置事务,methodB 设置了事务,methodA 调用 methodB 时,事务失效;
只有当事务方法被当前类以外的代码调用时,才会由 spring 生成代理对象管理事务;
- 异常被 catch 住了,不会再触发事务
在业务代码中一般不需要 catch 异常,如果非要 catch 一定要抛出 throw new RunTimeException() ,或注解中指定异常类型
@Transactional(rollbackFor=Exception.class),否则会导致事务失效。
- 数据库存储引擎不支持事务