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
.