O InnoDB
detecta automaticamente o deadlock
de transações e faz um roll back da(s) transação(ões)
para prevenir o deadlockck. A partir da versão 4.0.5, o
InnoDB
tentará escolher pequenas
transações para se fazer roll back. O tamanho de uma
transação é determinado pelo número de linhas que foram
inseridas, atualizadas ou deletadas. Antes da versão 4.0.5,
InnoDB
sempre fazia roll back da
transação cujo pedido de bloqueio fosse o último a criar o
deadlock, isto é, um ciclo no grafo de espera da transação.
O InnoDB
não pode detectar deadlocks onde
uma trava atribuida por uma instrução MySQL LOCK
TABLES
está envolvida ou se uma trava definida em
outro mecanismo de banco de dados diferente de
InnoDB
está envolvida. Você tem que
resolver estas situações usando
innodb_lock_wait_timeout
configurado em
my.cnf
.
Quando o InnoDB
realiza um rollback
completo de uma transação, todos as travas da transação
são liberadas. No entanto, se é feito o rollback de apenas
uma única instrução SQL como um resultado de um erro,
algumas das travass definidas pela instrução podem ser
preservadas. Isto ocorre porque o InnoDB
armazena as travas de registro em um formato onde ele não
pode saber qual trava foi definida por qual instrução SQL.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.