mysql加锁失败_并发下加锁不当,踩坑了!

本来是不打算写这个文章但是在一个群里面发现又有群友遇到和我一样的问题不知道咋办

c2e8ce02df53ebd5a725ec20a961677b.png

知识点

1、并发(勉强)

2、mysql MVCC原理

3、spring 事务机制

起因

这个话题是由最近一次对接第三方商城发现的,该商城执行流程很奇特,流程如下:

1、用户购买,三方平台调用本系统积分扣除接口,返回结果给三方。

2、三方回调本系统商品兑换接口,是否兑换成功,否单独调用三方失败处理接口(有步骤3回调),并返回现有接口结果给三方(有步骤3回调)。

3、三方回调用本系统商品兑换成功/失败接口(确认三方已经收到消息并处理)

ps:步骤2兑换流程 加锁——>查询订单是否存在——>扣积分——>插入订单——>减库存——>赠送金币——>释放锁(由于流程现在无论是否兑换成功都必须保存订单,所以不能在步骤2方法使用事务回滚)

这个流程总体看起来很怪,我也是第一次遇到这样的,不过即使觉得不合理也得按照人家的来。

问题

如果仔细看看上面执行流程就会发现步骤2会带来两次连续的回调,这个连续回调也引发了本文的问题。

在测试兑换失败场景时我这边要把扣的积分返还给用户,操作伪代码如下:

ServiceImpl:

@Transactional

public void dealOrderEx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值