在MySQL+InnoDB中,假设我有一个单表和两个线程都执行“SELECT ... FOR UPDATE”。假设这两个SELECT语句最终选择多行,例如它们都最终选择了行R42和R99。这可能会导致死锁吗?
我考虑到这种情况:第一个线程尝试锁定R42然后是R99,第二个线程尝试锁定R99然后是R42。如果我不幸的话,这两个线程将发生死锁。
我在MySQL的词汇表中阅读到了死锁定义:
死锁可能发生在事务锁定多个表(通过UPDATE或SELECT ... FOR UPDATE等语句),但顺序相反时...
为了减少死锁的可能性,...在SELECT ... FOR UPDATE和UPDATE ... WHERE语句中使用的列上创建索引。
这提示了我的情况(单表)不会发生死锁,也许是因为MySQL自动尝试按主键的顺序锁定行,但我想要确定,并且我找不到文档中确切说明正在发生什么的地方。
我考虑到这种情况:第一个线程尝试锁定R42然后是R99,第二个线程尝试锁定R99然后是R42。如果我不幸的话,这两个线程将发生死锁。
我在MySQL的词汇表中阅读到了死锁定义:
死锁可能发生在事务锁定多个表(通过UPDATE或SELECT ... FOR UPDATE等语句),但顺序相反时...
为了减少死锁的可能性,...在SELECT ... FOR UPDATE和UPDATE ... WHERE语句中使用的列上创建索引。
这提示了我的情况(单表)不会发生死锁,也许是因为MySQL自动尝试按主键的顺序锁定行,但我想要确定,并且我找不到文档中确切说明正在发生什么的地方。