我对使用JPA的实体进行悲观锁定。 db是DB2 v10.x,JPA 2.0,而不是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将其翻译成该陈述而不是更常见的陈述呢?