【问题标题】:MySQL: Prevent race condition - FOR UPDATE or LOCK IN SHARE MODE?MySQL:防止竞争条件 - FOR UPDATE 或 LOCK IN SHARE MODE?
【发布时间】:2009-05-13 09:23:54
【问题描述】:

这是我想要的交易顺序:

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

从我understand 来看,第一个选择只执行写锁定,而第二个选择执行读写锁定。

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

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

【问题讨论】:

    标签: mysql race-condition


    【解决方案1】:

    您可能想要使用 FOR UPDATE。

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

    来自 MySQL 文档:

    如果您将 FOR UPDATE 与存储一起使用 使用页锁或行锁的引擎, 查询检查的行是 写锁定直到结束 当前交易。使用锁定 SHARE MODE 设置一个共享锁 允许其他事务读取 检查行但不更新或 删除它们。

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

    【讨论】:

    • 这个答案是正确的,但我第一次理解时有些困难。我在这里对同一件事的解释略有不同:stackoverflow.com/questions/32827650/…。把它贴在这里以防万一有人觉得它有帮助。
    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2016-03-21
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多