MySQL:防止竞争条件 - 更新或锁定共享模式?

sya*_*yaz 3 mysql race-condition

这是我想要的交易订单:

  1. User1选择字段,执行操作,用新值更新.
  2. User2选择字段,执行操作,用新值更新.
  3. User3选择字段,执行操作,用新值更新.

据我所知,第一个选择只执行写锁定,而第二个执行读写锁定.

两者似乎都可用,但在第一种情况下,User2读取的值是多少?User1更新前的初始值,或者User1更新后的值(这是我想要的)?

所以我很困惑,我应该使用SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE?

Tob*_*ede 6

您可能想要使用FOR UPDATE.

使用"LOCK IN SHARE MODE",第二个用户仍然可以在更新之前读取该值.

来自MySQL文档:

如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束.使用LOCK IN SHARE MODE设置共享锁,允许其他事务读取已检查的行,但不更新或删除它们.

因此,即使LOCK IN SHARE MODE阻止更新,如果操作取决于读取值,您可能最终处于不一致状态.