问个数据一致性的问题

2022-01-14 15:18:31 +08:00
 MakHoCheung

一个接口有如下操作

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

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

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

update table set value =@newValue, version=2 where id=@id and version=1
MakHoCheung
2022-01-14 16:39:11 +08:00
@Chad0000 然后根据更新行数不是 1 重试是吧,懂了
jtwor
2022-01-14 16:45:03 +08:00
@MakHoCheung
例如用户表有一个钱包总金额字段,这时候用行锁,锁住这个用户,这样能防止其他事务去修改总金额。
锁很大程度是因为业务有顺序要求,让他们排队,金额库存扣减这些就是了。
乐观锁除了 3L 的,还能能避免那种超卖多扣 update table set value=value-@count where value-@count>=0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828255

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX