关于spring同一个类中方法调用事物失效

新人小白工作期间随笔记录

问题起源

在与第三方系统交互,系统设计为与第三方系统交互成功后提交事物,完成本次操作。生产环境中发现第三方系统长时间无响应,造成事物长时间无法提交,用户再次刷新页面填写数据进行重复提交。由于业务问题,数据库中唯一索引无法使用。

解决方案一:

使用redis在service中加锁,在第三方系统响应后释放锁

引发新问题

锁是放在service层代码中,造成锁释放的时候,事物尚未提交,此时恰好用户在页面再次发起请求,仍会出现重复提交问题。

解决方案二:

  1. controller加锁 ,调用service前加锁,事物提交后释放锁;
  2. 在写一个新的service方法A,方法A上不使用@Transactional注解,在这个方法内加锁调用业务方法B,在B上添加@Transactional注解,这样B方法事物提交后释放锁;
@Override
public void A(){
	lock();
	B();
	unlock();
	
}
@Override
@Transactional
public void B(){
	insert();
	webservcice-->调用第三方
}

实际测试结果:

方案二的第一种可以解决此问题
但是第二种方法B报

当在同一个类中方法相互调用时,如果希望事务能够生效,可以采取以下解决办法: 1. 使用代理调用方法:由于Spring事务管理是通过AOP代理实现的,所以可以通过使用代理对象调用方法来触发事务管理。可以通过将方法调用委托给代理对象来确保事务的生效。 2. 将被调用方法抽取到另一个类中:将被调用方法抽取到另一个类中,并确保在被调用方法上添@Transactional注解。这样,在调用方法调用被抽取的方法时,事务将能够生效。 3. 使用AspectJ模式的事务管理:Spring还提供了AspectJ模式的事务管理,可以在同一个类中方法相互调用时保持事务的生效。通过配置AspectJ的切面来实现事务的管理,可以细粒度地控制事务的传播行为和回滚条件。 需要注意的是,以上解决办法需要根据具体情况选择合适的方式,并确保在调用方法上正确地添@Transactional注解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring同一个service中方法相互调用事务不生效问题解决方案](https://blog.csdn.net/a1036645146/article/details/107469578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值