关于spring同一个类中方法调用事物失效
新人小白工作期间随笔记录
问题起源
在与第三方系统交互,系统设计为与第三方系统交互成功后提交事物,完成本次操作。生产环境中发现第三方系统长时间无响应,造成事物长时间无法提交,用户再次刷新页面填写数据进行重复提交。由于业务问题,数据库中唯一索引无法使用。
解决方案一:
使用redis在service中加锁,在第三方系统响应后释放锁
引发新问题
锁是放在service层代码中,造成锁释放的时候,事物尚未提交,此时恰好用户在页面再次发起请求,仍会出现重复提交问题。
解决方案二:
- 在controller加锁 ,调用service前加锁,事物提交后释放锁;
- 在写一个新的service方法A,方法A上不使用@Transactional注解,在这个方法内加锁调用业务方法B,在B上添加@Transactional注解,这样B方法事物提交后释放锁;
@Override
public void A(){
lock();
B();
unlock();
}
@Override
@Transactional
public void B(){
insert();
webservcice-->调用第三方
}
实际测试结果:
方案二的第一种可以解决此问题
但是第二种方法B报