Erstens hängen Deadlocks nicht von einer expliziten Sperrung ab. MySQLs LOCK TABLE oder die Verwendung von nicht standardmäßigen Transaktionsisolationsmodi sind NICHT erforderlich, um einen Deadlock zu haben. Sie können immer noch Deadlocks haben, wenn Sie niemals eine explizite Transaktion verwenden.
Deadlocks können an einem einzelnen Tisch ganz leicht passieren. Meistens stammt es von einem einzigen heißen Tisch.
Deadlocks können gleichmäßig sein passieren, wenn alle Ihre Transaktionen nur eine einzelne Zeile einfügen.
Ein Deadlock kann auftreten, wenn Sie
- Mehr als eine Verbindung zur Datenbank (offensichtlich)
- Jede Operation, die intern mehr als eine Sperre beinhaltet.
Was nicht offensichtlich ist, ist, dass eine einzelne Zeileneinfügung oder -aktualisierung meistens mehr als eine Sperre beinhaltet. Der Grund dafür ist, dass sekundäre Indizes auch während Einfügungen / Aktualisierungen gesperrt werden müssen.
SELECTs werden nicht gesperrt (vorausgesetzt, Sie verwenden den Standardisolationsmodus und FOR UPDATE nicht), sodass sie nicht die Ursache sein können.
SHOW ENGINE INNODB STATUS ist dein Freund. Es wird Ihnen eine Reihe (zugegebenermaßen sehr verwirrender) Informationen über Deadlocks geben, insbesondere über den neuesten.
- Du kannst Deadlocks nicht vollständig eliminieren, sie werden weiterhin in der Produktion auftreten (sogar auf Testsystemen, wenn sie richtig belastet werden)
- Streben Sie nach einer sehr geringen Anzahl von Deadlocks. Wenn 1 % Ihrer Transaktionen ins Stocken geraten, ist das möglicherweise zu viel.
- Erwägen Sie, die Transaktionsisolationsstufe Ihrer Transaktionen auf Read-Committed zu ändern, WENN SIE DIE AUSWIRKUNGEN VOLLSTÄNDIG VERSTEHEN
- Stellen Sie sicher, dass Ihre Software mit Deadlocks angemessen umgeht.