Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CannotAcquireLockException (Spring, Hibernate, MySQL)

Dies ist definitiv ein Deadlock Lage. Dies bezog sich eher auf einen MySQL-Fehler als auf ein Hibernate-Problem mit Ihren Klassen. Sehen wir uns zunächst die Definition eines Deadlocks an :

Weitere Informationen finden Sie auf dieser Seite:http://en.wikipedia.org/wiki/Deadlock

Wie gehen Sie mit dieser Situation um. Nun, Sie müssen den folgenden Artikel lesen:Deadlocks in InnoDB . Es enthält die meisten Informationen, die Sie benötigen. Dieser Artikel erklärt detailliert, wie man Deadlocks verfolgt und behandelt. Er ist ein Muss.

Im Wesentlichen müssen Sie basierend auf den obigen Informationen die folgenden Schritte ausführen:

  1. Erstellen Sie einen MySQL-Trace:Verfolgen Sie alle Abfragen, die auf dem MySQL-Server ausgeführt werden.
  2. Holen Sie sich die Deadlock-Trace-Informationen
  3. Gleichen Sie den Deadlock-Trace und den MySQL-Trace miteinander ab, um die Ursache des Deadlocks zu ermitteln.

Der Artikel über InnoDB enthält auch eine Liste von Abhilfemaßnahmen, daher werde ich sie hier nicht wiederholen. Denken Sie nur an Deadlocks ist kein schwerwiegender Fehler, Sie müssen nur damit umgehen. Fangen Sie also vielleicht die Ausnahme ab und versuchen Sie die Transaktion erneut. Stellen Sie außerdem sicher, dass Ihre von Hibernate generierten Abfragen in dem Sinne optimal sind, dass sie Indizes verwenden wo sie können usw. Eine andere Sache, die Sie versuchen könnten, ist Batching die Transaktion auf Hibernate und Ausführung im Batch .

Ich bin mir sicher, dass Sie mit den beiden oben genannten Links das Problem lösen können, und es wird eine wertvolle Erfahrung für Sie sein, dies selbst durchzuarbeiten. Wenn Sie ein bestimmtes Element finden, mit dem Sie Probleme haben, fügen Sie es der Frage hinzu und wir kümmern uns darum.