Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JPA级别选择更新跳过锁定_Java_Oracle_Jpa_Locking_Eclipselink - Fatal编程技术网

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

Java 从JPA级别选择更新跳过锁定,java,oracle,jpa,locking,eclipselink,Java,Oracle,Jpa,Locking,Eclipselink,在我的应用程序-Oracle with JPA EclipseLink中,我使用以下表达式锁定某些表中的记录子集: select * from MY_TABLE where MY_CONDITIONS for update skip locked 我在整个本机查询中运行它,但我必须为所有必需的实体编写该查询 是否有任何方法可以使用纯JPA跳过锁定的记录?我可以实现自己的锁定策略吗 我不介意更改JPA提供程序,但我想使用JPA API。Oracle不提供读锁,因为它不需要读锁;撤消日志会使其变得

在我的应用程序-Oracle with JPA EclipseLink中,我使用以下表达式锁定某些表中的记录子集:

select * from MY_TABLE where MY_CONDITIONS for update skip locked
我在整个本机查询中运行它,但我必须为所有必需的实体编写该查询

是否有任何方法可以使用纯JPA跳过锁定的记录?我可以实现自己的锁定策略吗


我不介意更改JPA提供程序,但我想使用JPA API。

Oracle不提供读锁,因为它不需要读锁;撤消日志会使其变得不必要。所以,SELECT…FOR UPDATE实际上只是Oracle的一个写锁


使用JPA,您希望将LockModeType设置为悲观写入

Hibernate提供升级锁定模式

使用JPA和Hibernate,要生成根据文档锁定的跳过,您必须结合悲观的JPA:

以及锁定超时设置,例如persistence.xml中的持久化单元:

<properties>
   <property name="javax.persistence.query.timeout" value="-2"/>
</properties>
请注意,您也可以为复杂查询配置此锁定模式

跳过锁定不是ANSI SQL的一部分。一些RDBMS(如以下)将此作为一项特定功能提供:

因此,对于纯JPA,不可能在查询中指定跳过锁定。 事实上,如中所述,JPA 2.1仅支持以下内容:

没有一个 乐观的 乐观力增量 悲观力增量 悲观的 悲观主义者 阅读 写 但是,要在查询中启用SKIP LOCKED,可以使用以下选项:

使用特定的JPA实现功能,例如允许通过JPA查询指定锁定的跳过,这要归功于上述悲观的写入锁定模式类型锁定超时特定设置的组合 像以前一样创建本机SQL查询
我知道这篇文章有点老,但作为记录,正如公认的答案所述,javax.persistence.lock.timeout org.hibernate.cfg.AvailableSettingsJPA_lock_timeout设置为-2 org.hibernate.lockoptions使用hibernate锁定跳过会导致跳过锁定。但是,这可以在运行时完成,而无需设置任何全局设置

自2.0 JPA以来,情况一直如此

entityManager.find(MyType.class, id, LockModeType.PESSIMISTIC_WRITE, new HashMap<String, Object>() {{
        put("javax.persistence.lock.timeout", "-2");
    }});

也许这有帮助-?这并不是JPA的用意。锁定整个表是可伸缩性杀手。也许再想想你想用这个实现什么。我同意,我并没有锁定整个表,这个选择就是一个例子。我使用这种方法来避免锁定整个表。我锁定下一步要更新的数据子集。我想忽略已经锁定的记录,因为如果其他进程拾取了这些记录,它们将不再与更新相关。除了本机查询,我看不到使用纯JPA的方法,因为skip locked是Oracle特有的,JPA不支持。您可能可以使用Hibernate的自定义方言来完成,EclipseLink应该有一个类似的功能,但是您仍然需要告知您想要一个特定的查询来使用该功能。Hibernate提供了执行该任务的LockMode.UPGRADE\u SKIPLOCKED,但JPA不支持。也许您可以通过混合使用Hibernate和JPA来完成这项工作,但这听起来很混乱!是,从mailqueue mailqueue0\uwhere mailqueue0\u0中选择mailqueue0\u0.id作为列。date@MaksimGumerov,您的javax.persistence.lock.timeout设置不正确。您必须设置-2而不是0,如答案中所述,以生成更新跳过锁定。这就是它在使用JPA时与Hibernate一起工作的方式。那么,通过将其设置为0,您到底想要实现什么呢?我现在明白了。我不知何故没有看到您提到这种方式也是特定于Hibernate的,即使在JPA设置中被正式表示。我的错。删除了我之前的大部分评论。嗯,查询超时-2适用于所有查询?作为使用SKIP LOCKED的指示器?奇怪的想法。这是一种在spring数据中实现的方法。这不是读取锁,而是在执行读取时获得的更新锁。最终的结果是其他更新被阻止,而不是读取。@PawelZieminski再次读取了我的答案;我不是在说你认为我是什么。
entityManager.find(MyType.class, id, LockModeType.PESSIMISTIC_WRITE, new HashMap<String, Object>() {{
        put("javax.persistence.lock.timeout", "-2");
    }});