En deadlock returnerer fejlen 1213
som du skal behandle på klientsiden
Bemærk, at en deadlock og låsevent er forskellige ting. I et dødvande er der ingen "mislykket" transaktion:de er begge skyldige. Der er ingen garanti for, hvilken der vil blive rullet tilbage.
Et dødvande opstår i et scenarie som dette:
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;
Er du sikker på, at du ikke forveksler det med en låst ventetid?
En låsevent opstår, når en transaktion forsøger at låse en ressource, der allerede er låst af en anden transaktion.
I eksemplet ovenfor sker en låsevent på trin 3
.
Da dette er en normal situation (i modsætning til en dødvande), som kan løses udefra ved at begå eller rulle tilbage den transaktion, der holder låsen, InnoDB
vil ikke forsøge at rulle den transaktion tilbage, der holder låsen.
I stedet vil den blot annullere den erklæring, der forsøgte at hente låsen, efter timeoutet indtræffer.
Timeout er som standard 50
sekunder og indstilles ved hjælp af innodb_lock_wait_timeout
.
Den mislykkede erklæring (den, der forsøgte at erhverve låsen) vil returnere fejlen 1205
.