webentwicklung-frage-antwort-db.com.de

So vermeiden Sie die Wartezeit für das Sperren der Wartezeit überschritten.

    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 .. ??

14
Dileep

Hier sind ein paar Vorschläge:

  1. "Lock wait timeout" tritt normalerweise auf, wenn eine Transaktion auf zu aktualisierende Datenzeilen wartet, die bereits von einer anderen Transaktion gesperrt wurden. 
  2. Meist liegt das Problem auf der Datenbankseite. Mögliche Ursachen können ein ungeeignetes Tabellendesign, große Datenmengen, Einschränkungen usw. sein. 
  3. Bitte überprüfen Sie diese ausführliche Antwort .
14
Santosh

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.

5
Ravi Chhatrala

Es könnte auch durch den Missbrauch der folgenden Anmerkungen verursacht werden, wie im this StackOverflow-Artikel:

@Transactional(propagation = Propagation.REQUIRES_NEW)
3
martoncsukas

(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:

    • PK-Duplikate einführen
    • Nicht vorhandene Datensätze/Einträge/Zeilen aktualisieren/lesen/löschen

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. 

1
Koffy

Überprüfen Sie, ob Ihre where-Klausel optimiert ist, d. H. Mit Primärschlüssel und/oder Indizes

0
gladiator

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.

0
Brian Ko