原则

  1. 修饰 public 方法才有效
    1. 针对 private 方法启用事务,动态代理方式的 AOP 不可行,需要使用静态织入方式的 AOP,也就是在编译期间织入事务增强代码,可以配置Spring 框架使用 AspectJ 来实现 AOP。你能否参阅 Spring 的文档 Using @Transactional with AspectJ 。注意:AspectJ 配合 lombok 使用,还可能会踩一些坑。
  2. 必须通过代理类外部调用才有效
    1. 可以注入当前类,看出是 cglib 增强

回滚条件

  1. 只有异常传播出了标记了 @Transactional 注解的方法,事务才能回滚
    1. 如果异常被标记 @Transactional 注解的方法自行 try catch,事务无法回滚
    2. 需要进行手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  2. 默认情况下,出现 RuntimeException(非受检异常)或 Error 的时候,Spring 才会回滚事务
    1. 所以 @Transactional 一般设置 rollbackFor=Exception.class

注意传播机制

  • 默认 REQUIRED,会加入当前事务中