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

乐观锁?

  •  
  •   salamanderMH · 30 天前 · 1423 次点击

    问题

    看网上例子都是加了一个"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
        1
    mikulch   30 天前
    都学会自问自答了。
        2
    mcfog   30 天前 via Android
    明天要做个退款 /支付失败后恢复库存的功能,gg
        3
    hdbzsgm   30 天前   ♥ 2
    靠某个值 不如靠一个单调递增的版本号那么靠谱 ABA 了解一下
        4
    salamanderMH   30 天前
    @mcfog 有订单表,退款后也可以加回去。
        5
    salamanderMH   30 天前
    @hdbzsgm 这里更新都会上锁,是 X 锁,也是靠谱的
        6
    hhhsuan   30 天前
    在一个名词后面加个问号,并不能构成一个问题
        7
    mcfog   30 天前 via Android
    @salamanderMH 说的就是任何一个地方有加的逻辑你的 num 乐观锁就不成立了
        8
    salamanderMH   30 天前
    @mcfog 为什么不成立了?
        9
    scemsjyd   30 天前 via Android   ♥ 1
    了解下 ABA
        10
    salamanderMH   30 天前
    @hdbzsgm @scemsjyd
    我看了下,如果可增可减的话,确实有 ABA 这个问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1163 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 36ms · UTC 18:01 · PVG 02:01 · LAX 10:01 · JFK 13:01
    ♥ Do have faith in what you're doing.