【发布时间】:2017-05-16 23:51:10
【问题描述】:
在我的应用程序 - Oracle with JPA (EclipseLink) 中,我使用以下表达式来锁定某些表中的记录子集:
select * from MY_TABLE where MY_CONDITIONS for update skip locked
我在本机查询中运行它,但我必须为所有必需的实体编写该查询。
有没有办法使用纯 JPA 跳过锁定的记录?我可以实施自己的锁定策略吗?
我不介意更改 JPA 提供程序,但我想使用 JPA API。
【问题讨论】:
-
也许这有帮助 - blogs.oracle.com/enterprisetechtips/entry/… ?这真的不是 JPA 的用途。锁定整个表是可伸缩性杀手。也许重新考虑一下你想用这个来完成什么。
-
我同意,我没有锁定整个表,这个选择就是一个例子。我使用这种方法来避免锁定整个表。我锁定了接下来要更新的数据子集。我想忽略已经锁定的记录,因为如果其他进程拾取它,它们就不再与更新相关。
-
我看不到使用纯 JPA 执行此操作的方法,除非使用本机查询,因为跳过锁定是 Oracle 特定的并且不受 JPA 支持。您可能可以使用自定义方言完成它(例如Hibernate,EclipseLink 应该有类似的功能),但您仍然需要传达您希望特定查询使用该功能。
-
Hibernate 提供了 LockMode.UPGRADE_SKIPLOCKED 来完成这项工作,但 JPA 不支持。也许你可以通过混合 Hibernate 和 JPA 来完成这项工作,但听起来很乱!
标签: java oracle jpa locking eclipselink