请教“高并发抢券”的问题。请大家指教。

2018-04-24 16:12:33 +08:00
 deming

业务问题:用户抢券,高并发。

业务表: 券表(简称:A),主要字段 id,券号,批次号,所属用户 ID

发券方法: 将当前批次 X 中的 未分配的券 发给当前用户 user1

原方法伪代码:

  fun(batchId,userId){
  
    [第一步] 当前的券 = select id from A WHERE A.批次号=batchId and 状态=未分配
     
    [第二步] update A set A.所属用户 ID = userId  where A.id = 当前的券
     
  }

存在问题: 不安全,明明刚更新给了张三的,结果转眼下个线程又给更新成李四了。

我的想法: 采用乐观锁来更新。但是如果乐观锁更新失败了如何“重试”? 我 AtomicInteger 中的“重试”采用但是 do...while... 循环。

问: 实际场景中 do...while... 不太合适吧? 这里你们是怎么重试的,重试多少次? 或者这个问题,又没有更好的解决方案。

1762 次点击
所在节点    问与答
3 条回复
timepast
2018-04-24 16:36:34 +08:00
兄弟搞混淆了吧! 事物和并发是两个概念。
letitbesqzr
2018-04-24 16:41:55 +08:00
迸发的情况就不要去考虑更新数据库了,砸到缓存上然后在慢慢同步到数据库去。
lurenw
2018-04-24 16:47:46 +08:00
1.缓存
2.秒杀券拆分(分表 etc )
3.select for update...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/449468

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX