sql >> Databasteknik >  >> RDS >> Mysql

MySQL Deadlock Detection via PHP

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 .



  1. C# med MySQL - Fel:Guiden bör innehålla 32 siffror med 4 bindestreck när man försöker öppna anslutningen

  2. Hämta procentandel av Count(*) till antalet av alla objekt i GROUP BY

  3. Anropa en medlemsfunktion rowCount() på ett icke-objekt

  4. Hur får jag den aktuella tidszonen för MySQL?