这是我想要的交易订单:
从understand开始,第一个选择只执行写锁定,而第二个选择执行读写锁定。
两者似乎都可用,但在第一种情况下,User2会读取什么值? User1更新前的初始值,或者User1更新后的值(这是我想要的)?
所以我很困惑,我应该使用SELECT ... FOR UPDATE还是SELECT ... LOCK IN SHARE MODE?
答案 0 :(得分:6)
您可能想要使用FOR UPDATE。
使用“LOCK IN SHARE MODE”,第二个用户仍然可以在更新之前读取该值。
来自MySQL文档:
如果对存储使用FOR UPDATE 使用页锁或行锁的引擎, 查询检查的行是 写锁定直到结束 当前交易。使用LOCK IN SHARE MODE设置共享锁 允许其他交易阅读 检查行但不更新或 删除它们。
因此,即使LOCK IN SHARE MODE阻止更新,如果您的操作取决于读取值,您可能最终处于不一致状态。