事务不生效
- 除非特殊配置(比如使用 AspectJ 静态织入实现 AOP),否则只有定义在 public 方法上的 @Transactional 才能生效。
原因是,Spring 默认通过动态代理的方式实现 AOP,对目标方法进行增强,private 方法无法代理到,Spring 自然也无法动态增强事务处理逻辑
- 必须通过代理过的类从外部调用目标方法才能生效
Spring 通过 AOP 技术对方法进行增强,要调用增强过的方法必然是调用代理后的对象
事务生效但也未回滚
-
Spring 默认只会对标记 @Transactional 注解的方法出现了 RuntimeException 和 Error 的时候回滚,
-
如果我们的方法捕获了异常,那么需要通过手动编码处理事务回滚。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-
如果希望 Spring 针对其他异常也可以回滚,那么可以相应配置 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来覆盖其默认设置