V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
deming
V2EX  ›  问与答

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

  •  
  •   deming · 2018-04-24 16:12:33 +08:00 · 1675 次点击
    这是一个创建于 2210 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    业务表: 券表(简称: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... 不太合适吧? 这里你们是怎么重试的,重试多少次? 或者这个问题,又没有更好的解决方案。

    3 条回复    2018-04-24 16:47:46 +08:00
    timepast
        1
    timepast  
       2018-04-24 16:36:34 +08:00 via Android
    兄弟搞混淆了吧! 事物和并发是两个概念。
    letitbesqzr
        2
    letitbesqzr  
       2018-04-24 16:41:55 +08:00
    迸发的情况就不要去考虑更新数据库了,砸到缓存上然后在慢慢同步到数据库去。
    lurenw
        3
    lurenw  
       2018-04-24 16:47:46 +08:00
    1.缓存
    2.秒杀券拆分(分表 etc )
    3.select for update...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   971 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:12 · PVG 04:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.