原则
- 修饰
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
,会加入当前事务中