在我的应用程序 - Oracle with JPA (EclipseLink) 中,我使用以下表达式锁定某些表中的记录子集:
select * from MY_TABLE where MY_CONDITIONS for update skip locked
我在整个 native 查询中运行它,但我必须为所有必需的实体编写该查询。
有什么方法可以使用纯 JPA 跳过锁定的记录吗?我可以实现自己的锁定策略吗?
我不介意更改 JPA 提供程序,但我想使用 JPA API。
最佳答案
Hibernate 提供了 UPGRADE_SKIPLOCKED 锁模式。
使用 JPA 和 Hibernate,根据 Hibernate LockMode 生成“SKIP_LOCKED”文档,您必须结合 PESSIMISTIC_WRITE JPA LockModeType :
entityManager.find(Department.class, 1, LockModeType.PESSIMISTIC_WRITE);
和锁定超时设置,例如在持久性单元的 persistence.xml 中:
<properties>
<property name="javax.persistence.query.timeout" value="-2"/>
</properties>
(请注意,您也可以为复杂查询配置此 LockMode)
SKIP LOCKED 不是 ANSI SQL 的一部分。以下某些 RDBMS 将此作为特定功能提供:
因此对于纯 JPA,不可能在查询中指定“SKIP LOCKED”。 事实上,如 LockModeType 中所述, JPA 2.1 仅支持以下内容:
- 无
- 乐观
- OPTIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_READ
- PESSIMISTIC_WRITE
- 阅读
- 写
但是,要在您的查询中启用 SKIP LOCKED,您可以使用以下替代方法:
- 使用特定的 JPA 实现功能,例如 Hibernate LockMode得益于 PESSIMISTIC_WRITE LockModeType Lock Timeout 特定设置的组合,它允许通过 JPA 查询指定 SKIP LOCKED
- 像您一样创建原生 SQL 查询
关于java - 选择更新跳过从 JPA 级别锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434169/