For det første er dødvande ikke afhængig af eksplicit låsning. MySQL's LOCK TABLE eller brug af ikke-standard transaktionsisoleringstilstande er IKKE påkrævet for at have en deadlock. Du kan stadig have deadlocks, hvis du aldrig bruger en eksplicit transaktion.
Deadlocks kan opstå på et enkelt bord, ganske nemt. Oftest er det fra et enkelt varmt bord.
Deadlocks kan selv ske, hvis alle dine transaktioner bare laver en enkelt række indsættelse.
Et dødvande kan ske, hvis du har
- Mere end én forbindelse til databasen (naturligvis)
- Enhver handling, der internt involverer mere end én lås.
Hvad der ikke er indlysende, er, at det meste af tiden involverer en enkelt række indsættelse eller opdatering mere end én lås. Grunden til dette er, at sekundære indekser også skal låses under indsættelser/opdateringer.
SELECTs låses ikke (forudsat at du bruger standard isolationstilstand og ikke bruger TIL OPDATERING), så de kan ikke være årsagen.
VIS MOTOR INNODB STATUS er din ven. Det vil give dig en masse (ganske vist meget forvirrende) information om dødvande, specifikt den seneste.
- Du kan ikke helt eliminere deadlocks, de vil fortsætte med at ske i produktionen (selv på testsystemer, hvis de stresser dem ordentligt)
- Sig efter et meget lavt antal dødvande. Hvis 1 % af dine transaktioner går i stå, er det muligvis for mange.
- Overvej at ændre transaktionsisolationsniveauet for dine transaktioner til read-committed, HVIS DU FULDT FORSTÅR KONSEKVENSERNE
- sørg for, at din software håndterer deadlocks korrekt.