Concurrency Spring JPA@QueryHint因锁定超时而被忽略?

Concurrency Spring JPA@QueryHint因锁定超时而被忽略?,concurrency,spring-data-jpa,locking,Concurrency,Spring Data Jpa,Locking,我在Spring data JpaRepository中有一个查询,如下所示: @Lock(value = LockModeType.PESSIMISTIC_WRITE) @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "70000")}) Collection<AnyCLass> findBy ... @Lock(value=LockModeType.悲观写入) @QueryHint

我在Spring data JpaRepository中有一个查询,如下所示:

@Lock(value = LockModeType.PESSIMISTIC_WRITE)
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "70000")})
Collection<AnyCLass> findBy ...
@Lock(value=LockModeType.悲观写入)
@QueryHints({@QueryHint(name=“javax.persistence.lock.timeout”,value=“70000”)})
收集由。。。
但是,在我的测试中,如果我在两个并发线程中运行事务(使用此查询作为第一个查询),则一秒钟后会得到一个SQL锁超时(
SQL错误:50200,SQLState:HYT00
),这是内存中H2的默认值。
如果事务处理速度快于1秒,则一切正常。

解决此问题的可能方法是对封闭方法进行简单重试:

@Retryable(backoff = @Backoff(value = 500,random = true))
void getSometingLocked(){
 findById(id)
}

非常感谢。这是我们已经做过的。问题更多的是关于这个暗示被忽略的事实。然而,对于许多数据库来说,这是正常的行为。@PeMa您能详细说明一下这是“默认行为”吗?我正在使用PostgreSQL,并在Spring数据中遇到了这个问题。但是,直接使用实体管理器,它会如预期的那样工作。@H.Schulz我不确定您所说的“直接使用实体管理器”到底是什么意思。如果配置实体管理器,则可能已配置另一个锁定超时。一般来说,大多数数据库都忽略了查询提示。它们相当尊重连接字符串中设置的标志。在没有设置任何标志的情况下,H2(用于测试的默认内存数据库)的锁定超时为2秒,而MariaDB的锁定超时为30秒(如果我没记错的话)。我不知道PostgreSQL,但在测试中使用H2和在生产中使用PostgreSQL时,您可能会有不同的行为。@PeMa我的意思是使用
entityManager.createQuery().setLockMode(悲观强制增量).setHint(“javax.persistence.lock.timeout”,25000).getSingleResult()
是否
选择更新
而不使用
nowait
选项,并使用spring数据jpa存储库,如问题中的
nowait
,即忽略查询提示。@H.Schulz在这种情况下,听起来像是springs jpa实现中的错误。也许你可以在那里提出错误报告。