Fehlerbehebung konsistent "SQLException: Lock wait timeout exceeded"

Ich habe eine Anwendung, die Quarz-1.6.1 w/persistent job store, mit MySQL 5.1 als die DB. Diese Anwendung verwendet, um boot-up okay in Tomcat6. Irgendwann fing es an das werfen einer Ausnahme bei JEDEM Hochfahren:

- MisfireHandler: Error handling misfires: Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction
org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction [See nested exception: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction]
    at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:112)
    at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:112)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3075)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.manage(JobStoreSupport.java:3838)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:3858)
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    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:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:92)
    ... 4 more

Sollte ich erwähnen, diese Anwendung nutzt auch der PPV w/Hibernate mit C3P0 für data source connection-pooling. Diese exception wird immer ausgelöst, direkt nach dem PPV beendet ist aktualisiere mein schema.

Zuerst habe ich ein Upgrade auf Quarz 1.6.5 und die Ausnahme ist Fort, aber die Anwendung erscheint eingefroren. Das Letzte, was in die logs - wobei die Ausnahme sein sollte - ist:

...hbm2ddl stuff...
2969 [Thread-1] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
- Handling 6 trigger(s) that missed their scheduled fire-time.

Nix mit kommen nach, und die webapp nicht die Verarbeitung von Anforderungen; Sie hängen einfach nur auf unbestimmte Zeit.

Wenn ich mysql Kommandozeilen-client mit SHOW INNODB STATUS direkt nach der Ausnahme, die es gilt konsequent zeigen zwei verdächtige Transaktionen:

----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 49, signal count 49
Mutex spin waits 0, rounds 2100, OS waits 0
RW-shared spins 115, OS waits 49; RW-excl spins 0, OS waits 0
------------
TRANSACTIONS
------------
Trx id counter 0 165688
Purge done for trx's n:o < 0 165685 undo n:o < 0 0
History list length 12
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, OS thread id 5012
MySQL thread id 8, query id 1798 localhost 127.0.0.1 root
SHOW INNODB STATUS
---TRANSACTION 0 165687, ACTIVE 300 sec, OS thread id 3772
2 lock struct(s), heap size 320, 1 row lock(s)
MySQL thread id 30, query id 1795 localhost 127.0.0.1 my_app
---TRANSACTION 0 165685, ACTIVE 360 sec, OS thread id 5460
2 lock struct(s), heap size 320, 1 row lock(s), undo log entries 1
MySQL thread id 34, query id 1680 localhost 127.0.0.1 my_app

Ich bin auf der Suche nach Orientierung, wie die weitere Untersuchung dieses Problems. Vielleicht, wenn ich könnte irgendwie identifizieren, die Eigentümer der beiden Geschäfte, oder was Ressourcen, die Sie sperren?

Update: ich löschte alle Zeilen in der qrtz_simple_triggers Tabelle ohne problem. Ich habe dann versucht, das gleiche zu tun auf der qrtz_triggers Tisch und mein MySQL-client-warf ein "Lock wait timeout exceeded" - Fehlermeldung. An diesem Punkt hörte ich meine (immer noch hängen) Anwendung und war dann in der Lage, löschen Sie alle Zeilen der qrtz_triggers Tabelle. Sobald dies getan wurde, konnte ich erfolgreich mein boot Anwendung.

Es scheint, ich brauchen, um sich eine neue Quarz-bug, aber ich würde gerne in der Lage sein, um Ihnen mehr Informationen über das, was tatsächlich hapenning hier. So, wie pro die ursprüngliche Frage, wie kann ich das beheben, diese Art von Fragen?

InformationsquelleAutor Robert Campbell | 2009-05-19

Schreibe einen Kommentar