1)默认配置下 Spring 只会回滚运行时异常(非受检查异常),即继承自 RuntimeException 的异常或者 Error。(官网

2)@Transactional 注解只能应用到 public 修饰的方法。(官网

几个常见的事务失效场景

  1.  @Transactional 应用在非 public 修饰的方法上

  2. @Transactional 注解回滚异常属性 rollbackFor 设置错误

  3. @Transactional 注解传播属性 propagation 设置错误

  4. 同类中内部方法相互调用,默认代理模式下,如果调用者自己已经有事务,则被调用的永远和它处于同一事务。被调用者的设置的 REQUIRES_NEW、NOT_SUPPORTED、NEVER 等等都不会有效,

  5. 同类中内部方法相互调用,调用者方法自己没有事务,自己也未加 @Transactionl,此时被调用方法上面即使加了 @Transaction,事务也不会生效。因为此时它不是使用的代理方式调用的,而是 this.xx调用的。

  6. 异常被 catch 捕获,没有继续往外抛,导致 @Transactional 失效

  7. 数据库存储引擎不支持事务导致失效

  8. 抛出的异常不正确,默认只回滚 RuntimeException(运行时异常)和 Error(错误)

  9. 多线程影响

  10. 事务方法被final、static修饰

  11. 当前类没有被Spring管理