3

这是我想要的交易顺序:

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

据我了解,第一个选择仅执行写锁定,而第二个选择执行读写锁定。

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

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

4

1 回答 1

7

您可能想使用 FOR UPDATE。

使用“锁定共享模式”,第二个用户仍然可以在更新之前读取该值。

来自 MySQL 文档:

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

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

于 2009-05-14T02:37:43.933 回答