乐观锁都有重试机制,用这个保证幂等性的时候,如何决定这次操作是否需要重试呢?

乐观锁都有重试机制,用这个保证幂等性的时候,如何决定这次操作是否需要重试呢?

比如下面两种操作会导致版本号不一致

1、与其他修改操作并发执行

2、重复提交

第一种情况版本号冲突以后需要做重试,因为这是正常的业务需求

第二种情况版本号冲突以后不能做重试,一旦重试就无法做到幂等了


当我点修改按钮的时候,发现版本号冲突,这时候应该很难区分什么原因导致冲突的,所以就不好确定能不能重试。

这个问题该如何解决?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
coding_zhang 2020-02-21 17:59:58

所有的update操作到数据库后, 都会变成串行,一条一条的去执行。

执行完一个update语句后,version的值就变了,后面带有相同的version的update语句都不会进行更新。

  • 提问者 慕尼黑414820 #1
    如果是多线程并发执行导致的更新失败,应该有补偿措施的吧? 比如同一时间两个线程同时增加某个账号的余额,其中一个线程因为版本不一致肯定会失败,根据业务需求这时候不允许报错,而是重试,等第一个线程更新完以后再更新。 但是如果是重复提交这种情况,是不能重试的。不知道如何区分这两种情况
    2020-02-21 20:36:14
  • coding_zhang 回复 提问者 慕尼黑414820 #2
    根据你描述的业务场景和业务需求,建议如下: 更新余额时使用update xxx set balance = balance + xxx where user_id =xxx 的形式,跟新语句中没有版本号,保持幂等采用token的方式。 每一个请求都带有一个唯一标识符token,后台记录这个token,每一个请求执行完以后,删除这个token。这样重试的请求的token是相同,后台就可以做出判断。 目前只能想到这么多,有其他问题,咱们还可以继续探讨。
    2020-02-22 19:52:49
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师