原则
- 修饰
public方法才有效- 针对 private 方法启用事务,动态代理方式的 AOP 不可行,需要使用静态织入方式的 AOP,也就是在编译期间织入事务增强代码,可以配置Spring 框架使用 AspectJ 来实现 AOP。你能否参阅 Spring 的文档
Using @Transactional with AspectJ。注意:AspectJ 配合 lombok 使用,还可能会踩一些坑。
- 针对 private 方法启用事务,动态代理方式的 AOP 不可行,需要使用静态织入方式的 AOP,也就是在编译期间织入事务增强代码,可以配置Spring 框架使用 AspectJ 来实现 AOP。你能否参阅 Spring 的文档
- 必须通过代理类外部调用才有效
- 可以注入当前类,看出是 cglib 增强
回滚条件
- 只有异常传播出了标记了
@Transactional注解的方法,事务才能回滚- 如果异常被标记
@Transactional注解的方法自行 try catch,事务无法回滚 - 需要进行手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- 如果异常被标记
- 默认情况下,出现
RuntimeException(非受检异常)或Error的时候,Spring 才会回滚事务- 所以
@Transactional一般设置rollbackFor=Exception.class
- 所以
注意传播机制
- 默认
REQUIRED,会加入当前事务中
