AopContext.currentProxy()

在同一个类中,非事务方法A调用事务方法B,事务失效,可以采用AopContext.currentProxy().xx()来进行调用,事务才能生效。

B方法被A调用,对B方法的切入失效,但加上AopContext.currentProxy()创建了代理类,在代理类中调用该方法前后进行切入。
对于B方法proxyA中调用只能对A进行增强,A里面调用B使用的是对象.B(),而不是$proxy.B(),所以对B的切入无效。

在Spring中,事务注解@Transactional是通过AOP实现的,即在运行时动态生成代理对象,对目标对象进行增强,在事务开始和结束时开启和提交/回滚事务。

由于Spring的事务管理是通过AOP实现的,它基于代理对象来实现事务的管理。当在一个类的方法中调用另一个方法时,如果两个方法都是在同一个类中的,而其中一个方法上有@Transactional注解,那么被调用的方法并不会被代理,因为代理只会对外部调用产生作用。

在这种情况下,被调用的方法上的@Transactional注解会被忽略,因为没有代理对象可以捕获到该注解,从而无法执行事务管理的逻辑。

如果你希望被调用的方法也能够被代理,以便在其中执行事务管理逻辑,可以将该方法提取到另一个单独的类中,或者通过依赖注入的方式将该方法的实例注入到当前类中,并通过注入的实例来调用该方法。这样,被调用的方法也会被代理,并能够正确执行事务管理逻辑。

AopContext.currentProxy()使用了ThreadLocal保存了代理对象,因此
AopContext.currentProxy().B()就能解决。

在不同类中,非事务方法A调用事务方法B,事务生效。
在同一个类中,事务方法A调用非事务方法B,事务具有传播性,事务生效
在不同类中,事务方法A调用非事务方法B,事务生效。

你可能感兴趣的:(AopContext.currentProxy())