如何让 H2 与 Spring 一起工作?
我正在编写一个扩展 Spring 的 AbstractTransactionalJUnit4SpringContextTests
的测试。
在我的应用程序代码中,我有一个在测试中调用的方法,注释如下:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
问题
我在使用 H2
作为内存模式下的底层数据源时遇到了问题。它给了我错误:
原因:
org.h2.jdbc.JdbcSQLException:尝试锁定表超时
MY_TABLE[50200-131]
当我删除传播时,它有效,当我使用 Oracle 或 MySQL 等替代数据库和 Propagation.REQUIRES_NEW 时,一切正常。
我正在使用 Spring 3.0.2-RELEASE
和 H2 1.2.131
。
如何让 H2
与 Spring 一起使用?
I am writing a test which extends Spring's AbstractTransactionalJUnit4SpringContextTests
.
In my application code I have a method which I call inside the test annotated by the following:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
Problem
I run into a problem while using H2
as the underlying data source in-memory mode. It gives me the error:
Caused by:
org.h2.jdbc.JdbcSQLException: Timeout trying to lock table
MY_TABLE[50200-131]
When I remove the propagation, it works, and when I use an alternative database such as Oracle or MySQL with Propagation.REQUIRES_NEW
, everything works fine.
I am using Spring 3.0.2-RELEASE
and H2 1.2.131
.
How can I get H2
to work with Spring?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道问题是什么,但尝试将 ;MVCC=TRUE 附加到数据库 URL。
I don't know what the problem is, but try appending ;MVCC=TRUE to the database URL.
使用 play-framework 作业(运行到单独的线程)进行 JUnit 测试时遇到同样的问题,并且 Thomas 提供的技巧有效! (将 ;MVCC=TRUE 附加到数据库 URL。)
我猜这个 MVCC 选项启用了“行级锁定”而不是锁定整个表,因此 LOCK 问题消失了,请参阅以下内容中的“行级锁定”功能:
http://www.h2database.com/html/features.html#in_memory_databases
H2 支持“行级锁定”:<*9 使用 MVCC(多版本并发)时。>
Had the same problem doing JUnit Tests with play-framework Jobs (that run into separate threads) and trick provided by Thomas works! (appending ;MVCC=TRUE to the database URL.)
I guess this MVCC option enables 'Row Level Locking' instead of locking the whole TABLE, and so the LOCK issue is gone, see "Row Level Locking" feature on:
http://www.h2database.com/html/features.html#in_memory_databases
'Row Level Locking' supported in H2: <*9 When using MVCC (multi version concurrency).>