2010-09-13 11 views
5

Wir haben den klassischen Spring/Hibernate/Mysql-Stack in Tomcat 5.5 ausgeführt. Gelegentlich kommt es zu einem Deadlock, wenn der Versuch ausläuft, eine Tabellenzeile zu sperren. Eine Art Deadlock-Ausnahme wird ausgelöst.Wie finden Sie beide Threads von einem Deadlock?

Die Ausnahme ist klar und die Stack-Trace zeigt an, was schief gelaufen ist. Aber es zeigt nicht den anderen Thread, der die tatsächliche Sperre hält. Wenn ich nicht weiß, was dieser Thread macht, ist alles nur eine Nadel im Heuhaufen.

FRAGE: Gibt es eine Möglichkeit, den anderen Thread zu finden?

Danke!

Jan

+2

Wo kommt die Ausnahme von - mysql? Kannst du einen Stacktrace buchen? –

+0

Woher wissen Sie, dass es nur ein anderer Thread ist? Es könnte eine lange Kette von Threads in einem Deadlock beteiligt sein. –

+0

Ich kenne die Anzahl der beteiligten Threads natürlich nicht. Aber die Anwendung ist ein typischer "one request = one thread" -Fall. Wir machen nichts mit Threading. Und da die Sperren exklusiv sind, kann es zu dieser Zeit nur einen Thread geben. –

Antwort

1

Versuchen Sie den folgenden Befehl in MySQL beim nächsten Mal mit einem Deadlock zu sehen. Dies sollte Ihnen den letzten Deadlock zeigen.

SHOW INNODB STATUS 

Normalerweise, wenn Sie einen Deadlock auf dem Anwendungsserver sehen zeigen die Protokolle nur das Opfer Faden (derjenige, der zurückgesetzt wurde). Da der andere Thread abgeschlossen wurde, wird keine Ausnahme ausgelöst. Sie müssen zu Ihrer Datenbank zurückkehren, um die Transaktionen neu zu erstellen.

Sobald Sie eine Erfassung von Ihrer DB für wo der Deadlock aufgetreten ist, können Sie weiter untersuchen.

+0

Dies wird nicht funktionieren, weil ich keinen Zugriff auf die Datenbank habe (natürlich nur bei der Produktion). Und selbst ich könnte, ich kann nicht schnell genug zurück zum Java-Code hinter den verschiedenen gesperrten Objekten. Ich muss den anderen Thread innerhalb der JVM sofort finden, nachdem die Ausnahme ausgelöst wurde. –

+0

Wer Ihre Produktionsdatenbank verwaltet, sollte in der Lage sein, die erforderlichen Informationen für Sie zu sammeln. Zu wissen, welche zwei Java-Transaktionen gesperrt sind, ist normalerweise nutzlos. Sie müssen sehen, was in Ihrer Datenbank passiert. Dies wird Ihnen sagen, wo in der Transaktion Ihr Schloss passiert ist, ob es in einem Index, Primärschlüssel usw. war. Es gibt viel zu gewinnen durch den Zugriff auf dieses Protokoll – Sean

+1

Sollte es nicht sein: "SHOW ENGINE INNODB STATUS" ? –

0

nicht sicher, ob Sie es bereits herausgefunden haben, aber wenn es ein Deadlock ist, würde Thread Dump hier eine große Hilfe sein. Je nachdem, auf welchem ​​Betriebssystem die Anwendung ausgeführt wird und auf welche Berechtigungen Sie zugreifen können, können Sie sie auf verschiedene Arten generieren.

  • auf * nix-Signal an den Prozess sendet VERL ('töten -3 pid') würde
  • mit jconsole/jvisualvm hat eine Option, die Arbeit machen es
  • mit Standard-jdk jstack zu bekommen (man denke - F -l-Optionen) wird der Trick
  • wenn Sie Glück haben, auf solaris sein pstack eine Menge

helfen Sobald Sie es haben, analysieren gesperrt/Threads warten, um eine Sackgasse zu finden. Sie können dies manuell tun oder einige vorhandene Analysatoren verwenden, die Deadlock-Erkennungsalgorithmen verwenden. Btw jvm hat einen eingebauten und es kann Ihnen die Idee direkt im Thread Dump geben.

Wenn ich Ihnen helfen kann, lassen Sie es mich wissen.

viel Glück.

Grüßen, baz

0

wenn es ein Code Problem ist man auf den laufenden Prozess jconsole mit und erkennt den Stillstand zu verbinden versuchen könnte.

0

Wenn Sie den Thread finden müssen, der eine Sperre enthält, können Sie dies in Eclipse über die Debug-Ansicht tun. Werfen Sie einen Blick auf http://archive.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/eclipse-news-part2b.html und scrollen Sie nach unten zu "Debugging Sperren und Deadlocks".

Die Sperren, die einem Thread gehören, sowie die Sperre, auf die ein Thread wartet, können in der Debug-Ansicht inline angezeigt werden, indem der Menübefehl Anzeigen Monitore im Dropdown-Menü Debug-Ansicht umgeschaltet wird. Threads und Locks, die an einem Deadlock beteiligt sind, sind rot markiert.

alt text