sya*_*yaz 3 mysql race-condition
这是我想要的交易订单:
据我所知,第一个选择只执行写锁定,而第二个执行读写锁定.
两者似乎都可用,但在第一种情况下,User2读取的值是多少?User1更新前的初始值,或者User1更新后的值(这是我想要的)?
所以我很困惑,我应该使用SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE?
您可能想要使用FOR UPDATE.
使用"LOCK IN SHARE MODE",第二个用户仍然可以在更新之前读取该值.
来自MySQL文档:
如果对使用页锁或行锁的存储引擎使用FOR UPDATE,则查询检查的行将被写入锁定,直到当前事务结束.使用LOCK IN SHARE MODE设置共享锁,允许其他事务读取已检查的行,但不更新或删除它们.
因此,即使LOCK IN SHARE MODE阻止更新,如果操作取决于读取值,您可能最终处于不一致状态.