Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Detecção de Deadlock MySQL via PHP


Um impasse retorna o erro 1213 que você deve processar no lado do cliente

Observe que um impasse e uma espera de bloqueio são coisas diferentes. Em um impasse, não há transação "falhou":ambos são culpados. Não há garantia de qual deles será revertido.

Um deadlock ocorre em um cenário como este:
UPDATE  t_first -- transacion 1 locks t_first
SET     id = 1;

UPDATE  t_second -- transaction 2 locks t_second
SET     id = 2;

UPDATE  t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
SET     id = 2;

UPDATE  t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
SET     id = 2;

Tem certeza de que não está confundindo com uma espera de bloqueio?

Uma espera de bloqueio ocorre sempre que uma transação tenta bloquear um recurso já bloqueado por outra transação.

No exemplo acima ocorre uma espera de bloqueio na etapa 3 .

Como esta é uma situação normal (diferente de um deadlock), que pode ser resolvido de fora, confirmando ou revertendo a transação que mantém o bloqueio, InnoDB não tentará reverter a transação que mantém o bloqueio.

Em vez disso, ele apenas cancelará a instrução que tentou adquirir o bloqueio após o tempo limite.

O tempo limite por padrão é 50 segundos e é definido usando innodb_lock_wait_timeout .

A declaração com falha (aquela que tentou adquirir o bloqueio) retornará o erro 1205 .