Detecção de Deadlock e Rollback
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 MariaDB 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.