salamanderMH
V2EX  ›  问与答

乐观锁?

  •  
  •   salamanderMH · Oct 20, 2019 · 3158 views
    This topic created in 2575 days ago, the information mentioned may be changed or developed.

    问题

    看网上例子都是加了一个"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的表,一个id和num字段,感觉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 replies  •  2019-10-20 21:56:52 +08:00
    mikulch
    mikulch
    Oct 20, 2019
    1
    都学会自问自答了。
    mcfog
    mcfog
    Oct 20, 2019 via Android
    2
    明天要做个退款 /支付失败后恢复库存的功能,gg
    hdbzsgm
    hdbzsgm
    Oct 20, 2019❤️2
    3
    靠某个值 不如靠一个单调递增的版本号那么靠谱 ABA 了解一下
    salamanderMH
    salamanderMH
    OP
    Oct 20, 2019
    4
    @mcfog 有订单表,退款后也可以加回去。
    salamanderMH
    salamanderMH
    OP
    Oct 20, 2019
    5
    @hdbzsgm 这里更新都会上锁,是 X 锁,也是靠谱的
    hhhsuan
    hhhsuan
    Oct 20, 2019
    6
    在一个名词后面加个问号,并不能构成一个问题
    mcfog
    mcfog
    Oct 20, 2019 via Android
    7
    @salamanderMH 说的就是任何一个地方有加的逻辑你的 num 乐观锁就不成立了
    salamanderMH
    salamanderMH
    OP
    Oct 20, 2019
    8
    @mcfog 为什么不成立了?
    scemsjyd
    scemsjyd
    Oct 20, 2019 via Android❤️1
    9
    了解下 ABA
    salamanderMH
    salamanderMH
    OP
    Oct 20, 2019
    10
    @hdbzsgm @scemsjyd
    我看了下,如果可增可减的话,确实有 ABA 这个问题。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1718 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    ♥ Do have faith in what you're doing.