【问题标题】:Non transactional request tries to get a lock with Derby非事务性请求尝试使用 Derby 获得锁
【发布时间】: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),而没有任何迹象表明非事务过程是这种情况。

感谢您的帮助

【问题讨论】:

    标签: spring hibernate derby


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      查看 propagation 的 spring 文档

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

      【讨论】:

      • 起初我没有在我的方法上添加任何@Transactional 并且有错误。我只尝试了 Propagation.NEVER 来验证没有使用事务来执行该方法。它现在被删除了。我希望这个请求在事务之外,所以 Propagation.SUPPORTS 不适合我,但我已经尝试过了,结果是一样的。我仍然有例外。我原以为非事务性请求的结果会是脏读,但它试图获得锁的事实让我感到困惑
      • 你能指定为什么你希望进程在事务之外执行吗?
      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2013-09-20
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2011-01-20
      相关资源
      最近更新 更多