sql >> Base de Datos >  >> RDS >> Mysql

MySQL Deadlock Detección a través de PHP

Un interbloqueo devuelve el error 1213 que debe procesar en el lado del cliente

Tenga en cuenta que un interbloqueo y una espera de bloqueo son cosas diferentes. En un interbloqueo, no hay transacción "fallida":ambos son culpables. No hay garantía de cuál se revertirá.

Se produce un interbloqueo en un escenario 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;

¿Estás seguro de que no lo estás confundiendo con una espera de bloqueo?

Se produce una espera de bloqueo cada vez que una transacción intenta bloquear un recurso que ya está bloqueado por otra transacción.

En el ejemplo anterior, se produce una espera de bloqueo en el paso 3 .

Dado que esta es una situación normal (a diferencia de un interbloqueo), que se puede resolver desde el exterior confirmando o revirtiendo la transacción que mantiene el bloqueo, InnoDB no intentará deshacer la transacción que mantiene el bloqueo.

En su lugar, simplemente cancelará la declaración que intentó adquirir el bloqueo después de que se agote el tiempo de espera.

El tiempo de espera por defecto es 50 segundos y se configura usando innodb_lock_wait_timeout .

La declaración fallida (aquella que trató de adquirir la cerradura) devolverá el error 1205 .