I've got this dead lock in H2, probably we have to take lock on database and pagestore always in the same order.
Found one Java-level deadlock:
=============================
"H2 Log Writer":
waiting to lock monitor 0x0000000042adf8e8 (object 0x00000000fd277c80, a org.h2.store.PageStore),
which is held by "main"
"main":
waiting to lock monitor 0x000000004242ee90 (object 0x00000000fd277d48, a org.h2.engine.Database),
which is held by "H2 Log Writer"
Java stack information for the threads listed above:
===================================================
"H2 Log Writer":
at org.h2.store.PageStore.flushLog(PageStore.java:985)
- waiting to lock <0x00000000fd277c80> (a org.h2.store.PageStore)
at org.h2.engine.Database.flush(Database.java:1780)
- locked <0x00000000fd277d48> (a org.h2.engine.Database)
at org.h2.store.WriterThread.run(WriterThread.java:86)
at java.lang.Thread.run(Thread.java:662)
"main":
at org.h2.engine.Database.lockMeta(Database.java:772)
- waiting to lock <0x00000000fd277d48> (a org.h2.engine.Database)
at org.h2.engine.Database.verifyMetaLocked(Database.java:760)
at org.h2.store.PageStore.addMeta(PageStore.java:1734)
- locked <0x00000000fd277c80> (a org.h2.store.PageStore)
at org.h2.index.PageBtreeIndex.<init>(PageBtreeIndex.java:62)
at org.h2.table.RegularTable.addIndex(RegularTable.java:223)
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:124)
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:68)
at org.h2.command.ddl.CreateTable.update(CreateTable.java:168)
at org.h2.command.CommandContainer.update(CommandContainer.java:75)
at org.h2.command.Command.executeUpdate(Command.java:230)
- locked <0x00000000fd2992d0> (a org.h2.engine.Session)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:177)
- locked <0x00000000fd2992d0> (a org.h2.engine.Session)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:152)
at org.h2.fulltext.FullTextLucene.init(FullTextLucene.java:106)