【发布时间】:2014-06-11 14:00:26
【问题描述】:
我目前正在使用 spring、hibernate 和 derby。两个进程同时访问同一个数据库,一个是事务性的并进行更改,另一个是非事务性的并读取数据。但是第二个(非事务性的)被阻止执行,堆栈跟踪是:
12:02:29.743 [http-8080-1] DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not execute query [select count(clienttemp0_.id) as col_0_0_ from CLIENT_TEMPLATE_SET clienttemp0_]
java.sql.SQLTransactionRollbackException: A lock could not be obtained within the time requested
at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.derby.impl.jdbc.EmbedResultSet.next(Unknown Source) ~[derby-10.10.2.0.jar:na]
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207) ~[commons-dbcp-1.4.jar:1.4]
我想知道为什么非事务性请求试图获得锁。我通过使用@Transactional(propagation = Propagation.NEVER) 检查了它是否真的是非事务性的。使用 Postgres,这两个进程都可以正常工作。事务请求具有以下参数:PROPAGATION_REQUIRED、ISOLATION_DEFAULT。自动提交设置为假。
我还检查了事务过程中的请求都包含在同一个事务中(根据日志:DEBUG o.s.orm.jpa.JpaTransactionManager - Participating in existing transaction),而没有任何迹象表明非事务过程是这种情况。
感谢您的帮助
【问题讨论】: