Spring 事务 RequestNew 不生效,不能创建新的事务

先看个缩减版的业务逻辑

逻辑上要求:当生成业务数据失败时,已落地的数据不可回滚

开发时将 数据落地 和 生成业务数据 这两个处理逻辑放在不同的事物中

@Service(“asyncSendMessage”)
public class AsyncSendMessageServiceImpl implements SendMessageService{

public Response doAsyncSendMessage(Request<Message> request){
	// do something
	this.indepHandleData(messageBO);
	
	return reponse;
}

public void indepHandleData(MessageBO messageBO){
	// handle data
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<aop:config proxy-target-class=“true” >

</aop:config>

<tx:advice id=“advice” transaction-manager=“transactionManager”>
tx:attributes
<tx:method name=“do*” propagation=“REQUIRED” read-only=“false” />
<tx:method name=“indep*” propagation=“REQUIRES_NEW” read-only=“false” />
</tx:attributes>
</tx:advice>
1
2
3
4
5
6
7
8
9
10
启动项目发现,indepHandleData() 和 doAsyncSendMessage()是在同一个事物中 ( indepHandleData()中抛出异常导致doAsyncSendMessage()中的数据会滚了 )

Spring 的事物实现是通过代理类来实现的,也就是我们调用doAsyncSendMessage()时调用的是代理中的方法,而此时在doAsyncSendMessage内部调用indepHandleData(),则调用的是目标类中的方法,所以无法开启新事物。

为了在调用indepHandleData()时开启新事物,需要调用代理类中的方法而不是目标类中的方法,解决方案有两种:

重新从Spring容器中获取当前对象
SendMessageService asyncSendMessage = (SendMessageService)SpringUtils.getBean(“asyncSendMessage”);
asyncSendMessage.indepHandleData(messageBO);
1
2
获取当前代理类对象

<aop:config proxy-target-class=“true” expose-proxy=“true”>

</aop:config>
1
2
3
4
((SendMessageService)AopContext.currentProxy()).indepHandleData(messageBO
————————————————
版权声明:本文为CSDN博主「不务正业的野猴子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/quan20111992/article/details/86814027

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值