Mysql
 sql >> Database >  >> RDS >> Mysql

Rilevamento deadlock MySQL tramite PHP

Un deadlock restituisce l'errore 1213 che dovresti elaborare sul lato client

Si noti che un deadlock e un'attesa di blocco sono cose diverse. In una situazione di stallo, non c'è transazione "fallita":entrambi sono colpevoli. Non vi è alcuna garanzia di quale verrà annullato.

Si verifica un deadlock in uno scenario come questo:

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;

Sei sicuro di non confonderlo con un'attesa di blocco?

Si verifica un'attesa di blocco ogni volta che una transazione tenta di bloccare una risorsa già bloccata da un'altra transazione.

Nell'esempio sopra si verifica un'attesa di blocco al passaggio 3 .

Poiché questa è una situazione normale (a differenza di un deadlock), che può essere risolta dall'esterno eseguendo il commit o il rollback della transazione che mantiene il blocco, InnoDB non tenterà di eseguire il rollback della transazione che mantiene il blocco.

Invece, cancellerà semplicemente l'istruzione che ha tentato di acquisire il blocco dopo che si è verificato il timeout.

Il timeout per impostazione predefinita è 50 secondi e viene impostato utilizzando innodb_lock_wait_timeout .

La dichiarazione fallita (quella che ha cercato di acquisire il lucchetto) restituirà l'errore 1205 .