Java.sql.SQLException: Lock wait timeout exceeded; try restarting tra
nsaction at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.Java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.Java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.Java:2648)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:2077)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.Java:
2228)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.Java:
208)
at org.hibernate.loader.Loader.getResultSet(Loader.Java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.Java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lo
ader.Java:259)
at org.hibernate.loader.Loader.loadEntity(Loader.Java:1885)
... 131 more
Während des Aktualisierens der Datensätze wird die Sperrzeitüberschreitung wiederholt überschritten.
Ich verwende Java Struts 2.1 Hibernate-Konfiguration . DB Verwendet wird MySQL.
Weiß jemand, wie man es löst .. ??
Hier sind ein paar Vorschläge:
Stellen Sie sicher, dass die Datenbanktabellen die InnoDB-Speicher-Engine und die Isolationsstufe READ-COMMITTED verwenden.
Sie können dies über SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
in der mysql-Konsole überprüfen.
Wenn es nicht auf READ-COMMITTED eingestellt ist, müssen Sie es einstellen. Stellen Sie vor dem Einstellen sicher, dass Sie SUPER-Berechtigungen in mysql haben.
Hilfe erhalten Sie unter http://dev.mysql.com/doc/refman/5.0/de/set-transaction.html .
Mit dieser Einstellung glaube ich, dass Ihr Problem gelöst wird.
Danke dir.
Es könnte auch durch den Missbrauch der folgenden Anmerkungen verursacht werden, wie im this StackOverflow-Artikel:
@Transactional(propagation = Propagation.REQUIRES_NEW)
(DB-spezifische Antworten mit Respekt ignorieren)
Wenn Sie ein formales CRUD Schema verwenden, bei dem der gesamte DB-Verkehr durch eine Singleton-Klasse geleitet wird, können Sie immer noch auf Thread-Sperren stoßen. Dies geschieht oft aufgrund eines Versehens zwischen Ihnen, einem College und dem Hibernate-Team. Daher ist es am schnellsten, den eigenen Code auf Fehler zu überprüfen, wobei den Kernregeln des Ruhezustands besondere Beachtung geschenkt wird.
Normalerweise hat ein CRUD Interface public 'Create', 'Read', 'Update' und 'Delete' Methoden, die gemeinsame private - Methoden verwenden. Dies geschieht für DRY Best Practice. Allerdings funktionieren diese Methoden meistens einwandfrei, jedoch nicht immer.
Also, wie kann man Thread-Locking testen und lösen?
Dafür sorgen:
session.save(myObj)
-Aktionen prüfen zunächst die Eindeutigkeit der PK Alle uniqueResult()
-Abfragen geben tatsächlich 1 Ergebnis zurück, und;
(Wichtig!) Fokus Testfälle, die:
Verwenden Sie schließlich @AfterSuite
( TestNG ), um alle Tabelleneinträge zu löschen. Jede ungenügende Implementierung führt zu einer weiteren Thread-Sperre für den oben genannten Vorgang. Andernfalls sind Sie Gold.
Überprüfen Sie, ob Ihre where-Klausel optimiert ist, d. H. Mit Primärschlüssel und/oder Indizes
Wenn alle oben genannten nicht funktionieren, überprüfen Sie die Fehlermeldung aus dem Mysql-Protokoll. Wenn die Größe der Protokolldatei erwähnt wird, müssen Sie sie in der Konfiguration erhöhen und den MySQL-Server neu starten.