java - 选择更新跳过从 JPA 级别锁定

标签 java oracle jpa locking eclipselink

在我的应用程序 - 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/

相关文章:

sql - SQL Server 中具有多列的“In”子句

java - JDBC 打开一个新的数据库 session

java - JpaRepository 与 EntityManager

java - 检查给定文件夹中是否存在任何文件

java - 无法使用 servlet 和 JavaMail 发送电子邮件

regex - 如何以特定方式替换新行和换行

database - JPQL View 返回重复项

java - 如何在链表中将所有偶数排列在奇数前面

java - 如何获取ConstraintValidatorContext?

JPA继承和复合主键扩展