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

类图如下:
请输入图片描述

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

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

在启动器上加入注解:@EnableAspectJAutoProxy(exposeProxy = true),该注解的作用是暴露AOP所代理对象
利用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所生成的动态代理的进行控制的,所以想让事务生效,必须使用代理对象调用配置了事务的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿咕咚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值