Mysql 当我选择多行进行更新时,是否可以死锁?

Mysql 当我选择多行进行更新时,是否可以死锁?,mysql,database-deadlocks,Mysql,Database Deadlocks,在MySQL+InnoDB中,假设我有一个表和两个线程,它们都执行“选择…进行更新”。假设两个SELECT语句都选择了多行,例如,它们都选择了行R42和R99。这可能会导致僵局吗 我在考虑这种情况:第一个线程尝试先锁定R42,然后锁定R99,第二个线程尝试先锁定R99,然后锁定R42。如果我运气不好,这两个线程将死锁 我在MySQL上读到 当事务锁定多个表中的行(通过UPDATE或SELECT…FOR UPDATE等语句)但顺序相反时,可能会发生死锁 为了减少死锁的可能性。。。在选择中使用的列上

在MySQL+InnoDB中,假设我有一个表和两个线程,它们都执行“选择…进行更新”。假设两个SELECT语句都选择了多行,例如,它们都选择了行R42和R99。这可能会导致僵局吗

我在考虑这种情况:第一个线程尝试先锁定R42,然后锁定R99,第二个线程尝试先锁定R99,然后锁定R42。如果我运气不好,这两个线程将死锁

我在MySQL上读到

当事务锁定多个表中的行(通过UPDATE或SELECT…FOR UPDATE等语句)但顺序相反时,可能会发生死锁

为了减少死锁的可能性。。。在选择中使用的列上创建索引。。。对于更新和更新。。。WHERE语句


这暗示在我的情况下(单表),我不会死锁,可能是因为MySQL自动尝试按主键的顺序锁定行,但我想确定一下,我在文档中找不到正确的位置来确切地告诉我发生了什么。

来自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.

因此,通常情况下,死锁不是致命的,您只需要重试,或者添加适当的索引,以便扫描更少的行,从而锁定更少的行