休眠提供UPGRADE_SKIPLOCKED锁定模式。
使用JPA和Hibernate,要根据Hibernate LockMode文档生成“SKIP_LOCKED”,您必须将PESSIMISTIC_WRITE JPA LockModeType相结合:
entityManager.find(Department.class, 1, LockModeType.PESSIMISTIC_WRITE);
和持久性单元的锁定超时设置(例如在持久性中.xml:
<properties>
<property name="javax.persistence.query.timeout" value="-2"/>
</properties>
(请注意,您也可以为复杂查询配置此锁定模式)
SKIP LOCK 不是 ANSI SQL 的一部分。某些 RDBMS(如下所示)将此作为特定功能提供:
因此,对于纯 JPA,无法在查询中指定“SKIP LOCKED”。实际上,如 LockModeType 中所述,JPA 2.1 仅支持以下内容:
- 没有
- 乐观的
- OPTIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_READ
- PESSIMISTIC_WRITE
- 读
- 写
但是,要在查询中启用 SKIP 锁定,您可以使用以下替代方法:
- 使用特定的 JPA 实现功能,例如 Hibernate LockMode,它允许通过 JPA 查询指定 SKIP LOCKED,这要归功于PESSIMISTIC_WRITE LockModeType Lock Timeout 特定设置的组合,如上所述
- 像您一样创建本机 SQL 查询