关于spring boot中的事务失效实际案例

关于spring boot中的事务失效实际案例

类图如下:

类图.png

抽象基类有一共拥有4个方法,其中sync方法为抽象方法,对应主要的业务逻辑;execute方法为模板方法,确定了相关方法的执行流程,如图:

执行流程.png

现在在sync方法上,我们需要进行事务控制,因此都需要在子类中需要进行声明式事务的配置,配置完成后,使用@Resource注入的方式获取到相关的service服务,启动执行后,发现事务根本没有生效。

解决方案:必须使用代理对象调用配置了事务的方法。

  1. 在启动器上加入注解:@EnableAspectJAutoProxy(exposeProxy = true),该注解的作用是暴露AOP所代理对象
  2. 利用AopContext.currentProxy()获取当前类的代理对象,前提是AOP代理已经被设置为暴露,这样该方式才能获取到代理对象,否则会报错(根据源码说明)

修改后的代码片段:

public void execute(String corpId) throws Exception {
    if (preCheck(corpId)) {
        // 获取当前spring代理对象
        DingSyncAbstractHandler proxy = (DingSyncAbstractHandler)AopContext.currentProxy();
        proxy.sync(corpId);
        postProcessor(corpId);
    }
}
复制代码

原因剖析:根据相关资料的查阅得知,在同一个类中,如果方法A(未配置任何事务)调用方法B(进行了声明式事务配置),那么如果是直接通过this的方式进行调用,则不会触发B中的事务,反之,如果方法B调用方法A,则会触发B中的事务,通过对spring相关源码的研读,发现spring的事务实际上是通过AOP所生成的动态代理的进行控制的,所以想让事务生效,必须使用代理对象调用配置了事务的方法。

おすすめ

転載: juejin.im/post/7065886252167331854