H2 deadlock with 1.3.154

218 views
Skip to first unread message

Uli

unread,
Apr 26, 2011, 11:30:22 AM4/26/11
to H2 Database
Hi!

Today I got a deadlock using the latest H2 release 1.3.154.
Unfortunately I am not 100% sure if the connection was opened with
MULTI_THREADED=TRUE or without.

But I have the relevant stack traces that show the problem which might
be useful to track down the problem:

Found one Java-level deadlock:
=============================
"com.mycompany.ReportTrigger_InternalReportTrigger":
waiting to lock monitor 0x000000004031a740 (object
0x00007f03ed8c9560, a org.h2.engine.Engine),
which is held by "com.mycompany.DbInserter"
"com.mycompany.DbInserter":
waiting to lock monitor 0x00000000401cb6c0 (object
0x00007f03ed88cef0, a org.h2.engine.Database),
which is held by "DefaultQuartzScheduler_Worker-2"
"DefaultQuartzScheduler_Worker-2":
waiting to lock monitor 0x00000000401cb618 (object
0x00007f03ee0daa18, a org.h2.engine.Session),
which is held by
"com.mycompany.ScheduledReportTrigger_InternalReportTrigger"
"com.mycompany.ScheduledReportTrigger_InternalReportTrigger":
waiting to lock monitor 0x00000000401cb6c0 (object
0x00007f03ed88cef0, a org.h2.engine.Database),
which is held by "DefaultQuartzScheduler_Worker-2"

Java stack information for the threads listed above:
===================================================
"com.mycompany.ReportTrigger_InternalReportTrigger":
at org.h2.engine.Engine.openSession(Engine.java:153)
- waiting to lock <0x00007f03ed8c9560> (a org.h2.engine.Engine)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
at org.h2.engine.Engine.createSession(Engine.java:121)
at org.h2.engine.Engine.createSession(Engine.java:28)
at
org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:
285)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:114)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:98)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
... my internal code - no locks held by this part ...

"com.mycompany.DbInserter":
at org.h2.engine.Engine.openSession(Engine.java:70)
- waiting to lock <0x00007f03ed88cef0> (a org.h2.engine.Database)
at org.h2.engine.Engine.openSession(Engine.java:159)
- locked <0x00007f03ed8c9560> (a org.h2.engine.Engine)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
at org.h2.engine.Engine.createSession(Engine.java:121)
at org.h2.engine.Engine.createSession(Engine.java:28)
at
org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:
285)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:114)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:98)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
... my internal code - no locks held by this part ...

"DefaultQuartzScheduler_Worker-2":
at org.h2.result.ResultTempTable.dropTable(ResultTempTable.java:157)
- waiting to lock <0x00007f03ee0daa18> (a org.h2.engine.Session)
- locked <0x00007f03ed88cef0> (a org.h2.engine.Database)
at org.h2.result.ResultTempTable.close(ResultTempTable.java:135)
- locked <0x00007f05260ef670> (a org.h2.result.ResultTempTable)
at org.h2.result.LocalResult.close(LocalResult.java:366)
at org.h2.command.dml.Insert.insertRows(Insert.java:141)
at org.h2.command.dml.Insert.update(Insert.java:86)
at org.h2.command.CommandContainer.update(CommandContainer.java:69)
at org.h2.command.Command.executeUpdate(Command.java:212)
- locked <0x00007f03ed88cef0> (a org.h2.engine.Database)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:177)
- locked <0x00007f05260ef838> (a org.h2.engine.Session)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:152)
... my internal code - no locks held by this part ...

"com.mycompany.ScheduledReportTrigger_InternalReportTrigger":
at org.h2.command.Command.executeUpdate(Command.java:205)
- waiting to lock <0x00007f03ed88cef0> (a org.h2.engine.Database)
at
org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:
181)
- locked <0x00007f03ee0daa18> (a org.h2.engine.Session)
at org.h2.store.LobStorage.storeBlock(LobStorage.java:529)
- locked <0x00007f03ed95a590> (a org.h2.store.LobStorage)
at org.h2.store.LobStorage.addLob(LobStorage.java:385)
- locked <0x00007f03ed95a590> (a org.h2.store.LobStorage)
at org.h2.store.LobStorage.createBlob(LobStorage.java:620)
at org.h2.jdbc.JdbcConnection.createBlob(JdbcConnection.java:1678)
at
org.h2.jdbc.JdbcPreparedStatement.setBinaryStream(JdbcPreparedStatement.java:
855)
at
org.h2.jdbc.JdbcPreparedStatement.setBinaryStream(JdbcPreparedStatement.java:
876)
... my internal code - no locks held by this part ...

Found 1 deadlock.

Can you see from the stacktraces if that's one of the common
multithreading table lock order problems?
I can provide more information if required.

Uli

Uli

unread,
Apr 28, 2011, 6:32:12 AM4/28/11
to H2 Database
I no longer think that it is a multithreading table lock order
problem. In such a case H2 threw a JDBCException and rolled back all
related transactions.

In my case the transactions are not rolled back but the H2 code
created a deadlock as it can be seen from the stack traces. So the
problem seems to be H2 internal.

Uli

Thomas Mueller

unread,
May 6, 2011, 9:30:02 AM5/6/11
to h2-database
Hi,

I think this is the same as this issue, which is now fixed in the
trunk: http://code.google.com/p/h2database/issues/detail?id=315

Regards,
Thomas

Uli

unread,
May 10, 2011, 2:51:49 AM5/10/11
to H2 Database
Great! Thanks a lot for fixing this in a short time!

Uli
Reply all
Reply to author
Forward
0 new messages