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

时间:2009-05-13 09:23:55

标签: mysql race-condition

这是我想要的交易订单:

  1. User1选择字段,执行操作,使用新值更新。
  2. User2选择字段,执行操作,使用新值更新。
  3. User3选择字段,执行操作,使用新值更新。
  4. understand开始,第一个选择只执行写锁定,而第二个选择执行读写锁定。

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

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

1 个答案:

答案 0 :(得分:6)

您可能想要使用FOR UPDATE。

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

来自MySQL文档:

  

如果对存储使用FOR UPDATE   使用页锁或行锁的引擎,   查询检查的行是   写锁定直到结束   当前交易。使用LOCK IN   SHARE MODE设置共享锁   允许其他交易阅读   检查行但不更新或   删除它们。

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