MakHoCheung
V2EX  ›  问与答

问个数据一致性的问题

  •  
  •   MakHoCheung · Jan 14, 2022 · 1448 views
    This topic created in 1669 days ago, the information mentioned may be changed or developed.

    一个接口有如下操作

    1. 从数据库读数据出来
    2. 根据 1 的数据插入或者更新数据

    大家在 1 步骤的时候会用 for update 锁行或者锁多行吗,还是说在一些并发高并且涉及到金钱才会加锁呢

    5 replies    2022-01-14 16:45:03 +08:00
    jtwor
        1
    jtwor  
       Jan 14, 2022
    不用 for update 排他锁,用行锁,多数是锁用户金额字段的主表吧
    MakHoCheung
        2
    MakHoCheung  
    OP
       Jan 14, 2022
    @jtwor 就是涉及金额的才锁的吗,一般业务锁不锁
    ktqFDx9m2Bvfq3y4
        3
    ktqFDx9m2Bvfq3y4  
       Jan 14, 2022 via iPhone
    乐观锁就行:加上版本号。未命中表示有人已经更新,重新查询再试

    update table set value =@newValue, version=2 where id=@id and version=1
    MakHoCheung
        4
    MakHoCheung  
    OP
       Jan 14, 2022
    @Chad0000 然后根据更新行数不是 1 重试是吧,懂了
    jtwor
        5
    jtwor  
       Jan 14, 2022
    @MakHoCheung
    例如用户表有一个钱包总金额字段,这时候用行锁,锁住这个用户,这样能防止其他事务去修改总金额。
    锁很大程度是因为业务有顺序要求,让他们排队,金额库存扣减这些就是了。
    乐观锁除了 3L 的,还能能避免那种超卖多扣 update table set value=value-@count where value-@count>=0
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2480 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:03 · PVG 00:03 · LAX 09:03 · JFK 12:03
    ♥ Do have faith in what you're doing.