Wie Deadlocks in Mysql / innodb erkennen?
-
22-07-2019 - |
Frage
Ich weiß, dass Deadlocks zwangsläufig auftreten, wenn Transaktionen in InnoDB verwenden und dass sie harmlos sind, wenn sie richtig durch den Anwendungscode behandelt werden -. „Es nur versuchen Sie es erneut“, wie das Handbuch sagt
Also ich frage mich - wie erkennen Sie Deadlocks? Herausgibt ein Deadlock einige spezielle MySQL-Fehlernummer? Ich bin mit PHP mysqli-Erweiterung wenn es ankommt.
Danke.
Edit: Lösung gefunden, siehe Kommentare
Lösung
http://dev.mysql.com/ doc / refman / 5.0 / de / innodb-error-codes.html
1213 (ER_LOCK_DEADLOCK)
Transaktions Deadlock. Sie sollten erneut ausführen die Transaktion.
Andere Tipps
"SHOW ENGINE BDB STATUS" aus dem MySQL-Kommandozeilen-Client (keine Abfrage-Browser) gibt Ihnen Informationen über Deadlocks.
Deadlocks können auch durch nicht abgeschlossene Transaktionen (in der Regel Programmfehler) und der Person verursacht werden, die die nicht ausgeführten Transaktion ausgeführt wird, wird das Problem nicht sehen, wie sie (über ihre Daten werden nicht verpflichtet) fein arbeiten werden.
Versuchen Sie Maatkit . Es hat einen Deadlock-Logger.
Versuchen Sie es mit MONyog . Aktivieren MONyog der „Deadlock Monitoring“ Option, um die Blockierungen durch INNODB STATUS berichtet zu verfolgen. MONyog wird eine Benachrichtigung an den Benutzer senden, wenn eine neue Deadlock auftreten.
Versuchen innotop, wird aus der Sackgasse für Sie ermitteln.
Wenn Sie auf einem Mac:
$ brauen installieren Percona-Toolkit
$ pt-Deadlock-Logger -uroot --ask Passlocalhost
Ich habe vor kurzem eine sehr einfache Prüfung für Deadlocks für die Durchführung eines Rauchtest eines Web applciation. Code kann viel verbessert werden, aber es funktioniert jetzt. Siehe https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html für weitere Informationen über die Ausgabe der verwendeten Abfrage unten.
$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;
if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}
if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}