本来是不打算写这个文章但是在一个群里面发现又有群友遇到和我一样的问题不知道咋办
知识点
1、并发(勉强)
2、mysql MVCC原理
3、spring 事务机制
起因
这个话题是由最近一次对接第三方商城发现的,该商城执行流程很奇特,流程如下:
1、用户购买,三方平台调用本系统积分扣除接口,返回结果给三方。
2、三方回调本系统商品兑换接口,是否兑换成功,否单独调用三方失败处理接口(有步骤3回调),并返回现有接口结果给三方(有步骤3回调)。
3、三方回调用本系统商品兑换成功/失败接口(确认三方已经收到消息并处理)
ps:步骤2兑换流程 加锁——>查询订单是否存在——>扣积分——>插入订单——>减库存——>赠送金币——>释放锁(由于流程现在无论是否兑换成功都必须保存订单,所以不能在步骤2方法使用事务回滚)
这个流程总体看起来很怪,我也是第一次遇到这样的,不过即使觉得不合理也得按照人家的来。
问题
如果仔细看看上面执行流程就会发现步骤2会带来两次连续的回调,这个连续回调也引发了本文的问题。
在测试兑换失败场景时我这边要把扣的积分返还给用户,操作伪代码如下:
ServiceImpl:
@Transactional
public void dealOrderEx