当我使用SELECT语句锁定多行时,是否会发生死锁?

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

3

来自MySQL文档

InnoDB uses automatic row-level locking. You can get deadlocks even in the case of 
transactions that just insert or delete a single row. That is because these operations    
are not really “atomic”; they automatically set locks on the (possibly several) index 
records of the row inserted or deleted.

通常情况下,死锁并不致命,你只需重试或添加适当的索引,以便扫描更少的行数,并因此锁定更少的行数。具体请参考http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlocks.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接