【发布时间】:2011-03-25 05:26:40
【问题描述】:
我正在编写一个扩展 Spring 的 AbstractTransactionalJUnit4SpringContextTests 的测试。
在我的应用程序代码中,我有一个在测试中调用的方法,并带有以下注释:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
问题
我在使用H2 作为底层数据源内存模式时遇到了问题。它给了我错误:
Caused by:org.h2.jdbc.JdbcSQLException: Timeout trying to lock tableMY_TABLE[50200-131]
当我删除传播时,它可以工作,而当我将 Oracle 或 MySQL 等替代数据库与 Propagation.REQUIRES_NEW 一起使用时,一切正常。
我正在使用 Spring 3.0.2-RELEASE 和 H2 1.2.131。
如何让H2 使用 Spring?
【问题讨论】:
-
使用 Propagation.REQUIRES_NEW 可能会打开一个新连接并因此创建一个新事务。这会导致并发问题,因为 junit spring 测试中当前正在运行事务,该事务已将数据插入表中,从而导致表锁定。我不明白使用 H2 的其他人是如何避免这个问题的!
-
我切换到 HSQLDB 1.8.0.10 并在我的测试方法上使用了 Propagation.REQUIRES_NEW,一切正常。这告诉我 H2 必须需要配置。
-
您的交易需要多长时间? H2 的默认事务超时相对较短(1 秒),因此除非您可以缩短事务,否则您可能需要增加 LOCK_TIMEOUT 设置(请参阅文档)。