Een deadlock retourneert fout 1213
die u aan de kant van de klant moet verwerken
Merk op dat een deadlock en lock wait verschillende dingen zijn. In een impasse is er geen "mislukte" transactie:ze zijn allebei schuldig. Er is geen garantie welke zal worden teruggedraaid.
Een impasse treedt op in een scenario als dit:
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;
Weet je zeker dat je het niet verwart met wacht op slot?
Een vergrendelingswacht treedt op wanneer een transactie een bron probeert te vergrendelen die al is vergrendeld door een andere transactie.
In het bovenstaande voorbeeld vindt er een lock wait plaats bij stap 3
.
Aangezien dit een normale situatie is (in tegenstelling tot een impasse), die van buitenaf kan worden opgelost door de transactie die de vergrendeling vasthoudt, te plegen of terug te draaien, InnoDB
zal niet proberen de transactie terug te draaien die de vergrendeling vasthoudt.
In plaats daarvan annuleert het gewoon de instructie die probeerde de vergrendeling te verkrijgen nadat de time-out is opgetreden.
De time-out is standaard 50
seconden en wordt ingesteld met innodb_lock_wait_timeout
.
De mislukte verklaring (die probeerde te verkrijgen het slot) geeft fout 1205
.