Spring项目中,本地方法调用事务失效的几种解决办法

900 阅读1分钟
众所周知,在spring项目中调用同一个类的本地的方法事务是不会生效的,因为调用本地方法并没有用上spring的代理。

如下图所示,doSave执行的代码不会运行在事务中的,spring也感知不到,要想事务能生效必须通过springz中的Bean调用执行事务的方法。

image.png

下面介绍几种解决方法

1. AopContext获取代理对象执行事务方法

image.png image.png

需要在启动类上加上@EnableAspectJAutoProxy(exposeProxy = true),开启spring的注解aop的支持。
然后可以通过 AopContext.currentProxy()获取代理对象再调用需要执行的事务方法事务就生效了。
需要注意在多线程中使用AopContext.currentProxy()获取代理会报错。
点开AopcContext的源码可以看到他是通过ThreadLocal实现的,多线程场运行会丢失上下文。
如果非要在多线程环境中使用需要自己维护线程上下文的传递

image.png

2. 通过ApplicationContextUtil.getBean(ClassT> clazz)获取代理对象执行事务方法

image.png image.png

如图所示,通过ApplicationContextUtil.getBean()方法,每次都是从spring中获取的对象,自然事务也能生效。
 

3. 懒加载循环注入自己到自己的属性中

image.png

如图所示,lazy加载注入自己到自己的属性中,这样self就是当前的代理对象,通过self调用事务方法当然事务也会生效