MySQL Deadlock analysieren

Hallo,

ich habe das Problem, das bei einem bestimmten Cronjob es manchmal zu einen Deadlock kommt.
Unter Deadlock verstehe ich, das ich eine DB Tabelle manipulieren (z.B. Update) möchte, diese aber gerade gesperrt ist, weil sie von einem anderen Prozess manipulieren wird. Oder sehe ich das falsch?

Nun meine eigentlich Frage, in der OXID log kann ich leider nicht herauslesen, welche andere Prozess/MySQL Befehl gerade auf die Tabelle zugreift. Gibt es da irgend einen Trick, wie ich herausbekomme, welche Prozesse gerade auf die Tabelle zugegriffen haben, oder welche Befehle auf die Tabelle ausgeführt werden?

Oder gibt es andere Möglichkeiten, wie man am besten mit solchen Deadlocks umgehen kann?
Habt ihr da Tips oder Tricks?

Vielen Dank

Moin :slight_smile:

über SHOW FULL PROCESSLIST; kannst Dir alle Queries anzeigen lassen welche aktuell noch in der Verarbeitung sind.

Ein Deadlock kommt beim OXID meist, wenn Updates auf die Kategorien laufen lässt. Da die ganze Baumstruktur neu berechnet wird.

Daher hat es sich bewährt bei Kategorien Updates erst im Anschluss dafür zu Sorgen wenn alle Änderungen durch sind einmalig die Baumstruktur neu berechnen zu lassen.

Das kann ich ja dann aber nur machen, wenn gerade der Deadlock eintritt? Leider tritt dieser nur sporadisch bei einem Cronjob auf.

Bei mir tritt der der Deadlock auf, wenn ich die save Methode eines OrderArticles Objekt ausführe. Da sollten die Kategorien keine Rolle spielen, oder täusche ich mich?

Ja. Mein Ansatz wäre in einer Kopie vom LIVE-Shop Cronjob manuell zu starten und nebenbei Prozessliste anzugucken wo es hakt.

Schwer zu beurteilen. Könntest prüfen ob es Module gibt welche diese Methode überladen, ob dort die Vererbungskette auch eingehalten wird, ob er dort irgendwo raus springt was der Cronjob später aber benötigt und sich dadurch aufhängt.

Vielen Dank schon mal für deine Tipps :slight_smile:

Wäre es eigentlich auch möglich, das Ergebnis von SHOW FULL PROCESSLIST in eine Log Datei zu schreiben?

1 Like

Gerne. Dies kannst über MySQL Doku sicherlich gut in Erfahrung bringen.