非事务性请求尝试使用Derby获取锁定

时间:2014-06-11 14:00:26

标签: spring hibernate derby

我目前正在使用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。 autoCommit设置为false。 我还检查了事务处理中的请求都包含在同一个事务中(根据日志:DEBUG o.s.orm.jpa.JpaTransactionManager - Participating in existing transaction),而没有任何内容表明非事务处理的情况。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我忘了说它是关于嵌入式德比的,根据文档,它不允许同时进行多次操作。见http://db.apache.org/derby/docs/10.10/devguide/ “部署选项和线程和连接模式”部分。它似乎回答了我的问题。然后我会看看我是否可以改变要求。

答案 1 :(得分:0)

查看propagation

的spring文档

您将非事务处理过程设置为propagation=Propagation.NEVER,它以非事务方式执行,并且不支持现有且已在运行的事务(在您的情况下,这是第二个进程)。 你应该切换到支持当前事务的propagation=Propagation.SUPPORTS,如果不存在则执行非事务性的事务。