Dom*_*cki 13 java oracle jpa locking eclipselink
在我的应用程序 - 带JPA的Oracle(EclipseLink)中,我使用以下表达式来锁定某些表中的记录子集:
select * from MY_TABLE where MY_CONDITIONS for update skip locked
Run Code Online (Sandbox Code Playgroud)
我在本机查询中运行它,但我必须为所有必需的实体编写该查询.
有没有办法使用纯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);
Run Code Online (Sandbox Code Playgroud)
和锁定超时设置,例如在持久性单元的persistence.xml中:
<properties>
<property name="javax.persistence.query.timeout" value="-2"/>
</properties>
Run Code Online (Sandbox Code Playgroud)
(请注意,您也可以为复杂查询配置此LockMode)
SKIP LOCKED不是ANSI SQL的一部分.以下一些RDBMS将此作为特定功能提供:
因此,对于纯JPA,无法在查询中指定"SKIP LOCKED".实际上,正如LockModeType中所记载的那样,JPA 2.1仅支持以下内容:
但是,要在查询中启用SKIP LOCKED,您可以使用以下替代方法:
对于 spring JpaRepository,可以使用:
String SKIP_LOCKED = "-2";
@QueryHints(@QueryHint(name = AvailableSettings.JPA_LOCK_TIMEOUT, value = SKIP_LOCKED))
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<YourEntity> fooBar();
Run Code Online (Sandbox Code Playgroud)
在 Oracle 上运行良好,不确定其他的