gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com