Ten eerste zijn deadlocks niet afhankelijk van expliciete vergrendeling. MySQL's LOCK TABLE of het gebruik van niet-standaard transactie-isolatiemodi zijn NIET vereist om een deadlock te hebben. U kunt nog steeds impasses hebben als u nooit een expliciete transactie gebruikt.
Deadlocks kunnen vrij gemakkelijk op een enkele tafel plaatsvinden. Meestal is het van een enkele warme tafel.
Deadlocks kunnen zelfs gebeuren als al uw transacties slechts een enkele rij invoegen.
Er kan een impasse ontstaan als u
- Meer dan één verbinding met de database (uiteraard)
- Elke operatie waarbij intern meer dan één vergrendeling betrokken is.
Wat niet voor de hand ligt, is dat het invoegen of bijwerken van een enkele rij meestal meer dan één slot omvat. De reden hiervoor is dat secundaire indexen ook moeten worden vergrendeld tijdens het invoegen / bijwerken.
SELECT's worden niet vergrendeld (ervan uitgaande dat u de standaard isolatiemodus gebruikt en niet FOR UPDATE gebruikt), dus ze kunnen niet de oorzaak zijn.
TOON MOTOR INNODB STATUS is je vriend. Het geeft je een heleboel (weliswaar zeer verwarrende) informatie over impasses, met name de meest recente.
- Je kunt impasses niet volledig elimineren, ze zullen blijven optreden in de productie (zelfs op testsystemen als ze op de juiste manier worden benadrukt)
- Streef naar een zeer laag aantal deadlocks. Als 1% van uw transacties vastloopt, is dat mogelijk te veel.
- Overweeg om het transactie-isolatieniveau van uw transacties te wijzigen in read-committed ALS U DE IMPLICATIES VOLLEDIG BEGRIJPT
- zorg ervoor dat uw software op de juiste manier omgaat met impasses.