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

问个数据一致性的问题

  •  
  •   MakHoCheung · 2022-01-14 15:18:31 +08:00 · 934 次点击
    这是一个创建于 842 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个接口有如下操作

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

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

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

    update table set value =@newValue, version=2 where id=@id and version=1
    MakHoCheung
        4
    MakHoCheung  
    OP
       2022-01-14 16:39:11 +08:00
    @Chad0000 然后根据更新行数不是 1 重试是吧,懂了
    jtwor
        5
    jtwor  
       2022-01-14 16:45:03 +08:00
    @MakHoCheung
    例如用户表有一个钱包总金额字段,这时候用行锁,锁住这个用户,这样能防止其他事务去修改总金额。
    锁很大程度是因为业务有顺序要求,让他们排队,金额库存扣减这些就是了。
    乐观锁除了 3L 的,还能能避免那种超卖多扣 update table set value=value-@count where value-@count>=0
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   797 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:11 · PVG 06:11 · LAX 15:11 · JFK 18:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.