1

我使用 JPA 对实体进行悲观锁定。数据库是 DB2 v10.x,JPA 2.0 over Hibernate 4.x。

我不想等到锁可用(它被一个长时间运行的进程锁定,保持实体上的锁几分钟)。我希望它早点失败(说“有人在这里工作”),然后让用户决定他是否想重试。我在用着:

Map<String, Object> properties = new HashMap<>();
properties.put("javax.persistence.lock.timeout", 0);
getEntityManager().lock(entity, LockModeType.PESSIMISTIC_WRITE, properties);

但是超时提示不被尊重(注意:无论我如何配置它,在 Spring 配置级别,在 JDBC 连接级别或其他)。将其设置为您喜欢的任何内容都不会改变任何内容。

我怀疑这是因为它被翻译成 SQL :

select ID from FOOBAR where ID =? and VERSION =? **for read only with rs use and keep update locks**

..而且任何地方都没有“NOWAIT”条款。

是否有可能使超时按预期工作,也许让 JPA 做一个SELECT ... FOR UPDATE NOWAIT?此外,如果有人知道为什么 JPA 将其翻译为该语句而不是更常见的语句?

4

0 回答 0