Ett dödläge returnerar felet 1213
som du bör bearbeta på klientsidan
Observera att låsning och låsning är olika saker. I ett dödläge finns det ingen "misslyckad" transaktion:de är båda skyldiga. Det finns ingen garanti för vilken som kommer att återställas.
Ett dödläge uppstår i ett scenario som detta:
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;
Är du säker på att du inte blandar ihop det med en låst väntan?
En lås väntan inträffar när en transaktion försöker låsa en resurs som redan är låst av en annan transaktion.
I exemplet ovan inträffar en lås väntan i steg 3
.
Eftersom detta är en normal situation (till skillnad från ett dödläge), som kan lösas utifrån genom att utföra eller rulla tillbaka transaktionen som håller låset, InnoDB
kommer inte att försöka återställa transaktionen som håller låset.
Istället kommer den bara att avbryta uttalandet som försökte få låset efter att timeout inträffat.
Timeout är som standard 50
sekunder och ställs in med innodb_lock_wait_timeout
kod>
.
Det misslyckade uttalandet (det som försökte skaffa låset) returnerar felet 1205
.