- 大家都知道在事务里面如果发生了内部调用那么事务会失效,具体的原因是因为事务的根本还是aop也就是动态代理,那么如果是类里面自己调用的话是不会使用代理对象去调用的而是使用普通类,举个例子:
public class O{
@Transactional
public void a(){
// 进入a方法
A方法
.......
// 方法内部调用,不是代理对象不触发aop
b();
}
// 让该方法拥调用创建自己的事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void b(){
B方法
.......
}
}
上述代码通过代理对象调用a()方法如果a里面调用b那么b的事务就会失效并且加入a的事务
如果这时候在a()里面通过代理对象调用b()那么b就会通过切面去执行方法b上面的事务就会生效
- 解决办法就是可以通过自己类注入自己类然后通过注入的动态代理对象进行方法的调用.
- 或者可以通过(O)AopContext.getCurrentProxy();这个方法就可以返回当前类的代理对象,记得要强转.但是切记要在启动类上面加上@EnableAspectJAutoProxy(exposeProxy = true)