我目前正在使用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
),而没有任何内容表明非事务处理的情况。
感谢您的帮助
答案 0 :(得分:1)
我忘了说它是关于嵌入式德比的,根据文档,它不允许同时进行多次操作。见http://db.apache.org/derby/docs/10.10/devguide/ “部署选项和线程和连接模式”部分。它似乎回答了我的问题。然后我会看看我是否可以改变要求。
答案 1 :(得分:0)
您将非事务处理过程设置为propagation=Propagation.NEVER
,它以非事务方式执行,并且不支持现有且已在运行的事务(在您的情况下,这是第二个进程)。
你应该切换到支持当前事务的propagation=Propagation.SUPPORTS
,如果不存在则执行非事务性的事务。