正常controller 调用service1 事务方法 生效
Service1非事务方法 调用service2事务方法 生效
Service1非事务方法 调用service1事务方法 不生效
这个其实和代理有关系,@Transactional Spring 事务注解是基于 Spring AOP 来实现的,而 Spring AOP 又是基于动态代理实现的;
动态代理分 JDK 动态代理和 Cglib 动态代理,Spring AOP 是基于 Cglib 动态代理实现的;
也就是说 Spring AOP 是在动态代理类中在切点位置切了一刀,去执行而外的处理;
非事务方法调事务方法时实际走的不是动态代理类,而是被代理类包裹的实际实现类中自己的方法,所以不会被 Spring AOP 切到,也就导致 @Transactional 事务注解不生效;
解决办法
1丶拿到当前类的代理类
通过 AopContext.currentProxy() 拿到当前类的代理类
2丶把非事务方法抽到另一个 Service 中
不推荐第一种方法,推荐第二种方法