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

乐观锁?

  •  
  •   salamanderMH · 2019-10-20 12:07:14 +08:00 · 2245 次点击
    这是一个创建于 1621 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题

    看网上例子都是加了一个"version"(版本号)的字段,然后更新语句是:

    // 查询需要更新的数据的版本号
    SELECT VERSION FROM `ubo_crowd` WHERE crowd_id = 12;
    // 更新数据,这里#{version}表示上面查询得到的版本号
    UPDATE `ubo_crowd` SET STATUS=2,VERSION=VERSION+1 WHERE crowd_id=12 AND VERSION=#{version};
    

    我现在设计了一张stock的表,一个idnum字段,感觉num字段直接就可以当作版本号的作用

    // num 是之前 select 语句读取出来的
    const results = await this.app.mysql
                    .query('update stock set num = num - 1 where id = ? and num = ?', [id, num])
    

    我觉得乐观锁也是靠 MySQL 的行锁( update 语句的缘故)

    10 条回复    2019-10-20 21:56:52 +08:00
    mikulch
        1
    mikulch  
       2019-10-20 12:19:52 +08:00
    都学会自问自答了。
    mcfog
        2
    mcfog  
       2019-10-20 12:23:59 +08:00 via Android
    明天要做个退款 /支付失败后恢复库存的功能,gg
    hdbzsgm
        3
    hdbzsgm  
       2019-10-20 12:26:14 +08:00   ❤️ 2
    靠某个值 不如靠一个单调递增的版本号那么靠谱 ABA 了解一下
    salamanderMH
        4
    salamanderMH  
    OP
       2019-10-20 13:04:11 +08:00
    @mcfog 有订单表,退款后也可以加回去。
    salamanderMH
        5
    salamanderMH  
    OP
       2019-10-20 13:12:06 +08:00
    @hdbzsgm 这里更新都会上锁,是 X 锁,也是靠谱的
    hhhsuan
        6
    hhhsuan  
       2019-10-20 13:14:59 +08:00
    在一个名词后面加个问号,并不能构成一个问题
    mcfog
        7
    mcfog  
       2019-10-20 13:23:25 +08:00 via Android
    @salamanderMH 说的就是任何一个地方有加的逻辑你的 num 乐观锁就不成立了
    salamanderMH
        8
    salamanderMH  
    OP
       2019-10-20 17:05:37 +08:00
    @mcfog 为什么不成立了?
    scemsjyd
        9
    scemsjyd  
       2019-10-20 21:17:41 +08:00 via Android   ❤️ 1
    了解下 ABA
    salamanderMH
        10
    salamanderMH  
    OP
       2019-10-20 21:56:52 +08:00
    @hdbzsgm @scemsjyd
    我看了下,如果可增可减的话,确实有 ABA 这个问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   940 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:52 · PVG 04:52 · LAX 13:52 · JFK 16:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.