Spring 数据 JPA 本机查询跳过锁定

Aya*_*yan 7 spring hibernate jpa spring-data-jpa

我想SKIP LOCKED使用 Spring Data JPA 在 Oracle上执行查询,所以我尝试了以下操作:

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "SELECT * FROM User WHERE ID=?1 FOR UPDATE SKIP LOCKED", nativeQuery = true)
User findOne(UUID id);
Run Code Online (Sandbox Code Playgroud)

I tried the above and found that the generated query contains FOR UPDATE, but not SKIP LOCKED (below is the generated query from logs):

select ent0_.column1 as name, ent0_.CREATED_DATE as CREATED_2_33_0_ from TABLE_NAME alias_name where ent0_.column1=? for update
Run Code Online (Sandbox Code Playgroud)

If I remove @Lock from the query method, the generated query does not even have FOR UPDATE.

Please suggest how I can generate a query with FOR UPDATE SKIP LOCKED, as required.

Mua*_*tik 5

您可以设置-2超时值,以便尽可能使用“跳过锁定”。

\n\n
\n

PESSIMISTIC_WRITE 的 javax.persistence.lock.timeout 设置为 -2

\n\n

升级_跳过锁定

\n\n

锁获取请求会跳过已锁定的行。它在 Oracle 和 PostgreSQL 9.5 中使用\n SELECT \xe2\x80\xa6\xe2\x80\x8b FOR UPDATE SKIP LOCKED,或\n SELECT \xe2\x80\xa6\xe2\x80\x8b with (rowlock, updlock, SQL Server 中的 readpast)。

\n
\n\n
public interface MyRepository extends CrudRepository<MyEntity, Long> {\n\n    /**\n     * The lock acquisition request skips the already locked rows.\n     * It uses a SELECT \xe2\x80\xa6\xe2\x80\x8b FOR UPDATE SKIP LOCKED in Oracle and PostgreSQL 9.5,\n     * or SELECT \xe2\x80\xa6\xe2\x80\x8b with (rowlock, updlock, readpast) in SQL Server.\n     */\n    String UPGRADE_SKIPLOCKED = "-2";\n\n    @Lock(value = LockModeType.PESSIMISTIC_WRITE) // adds \'FOR UPDATE\' statement\n    @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = UPGRADE_SKIPLOCKED)})\n    MyEntity findFirstByStatus(String status);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过这样做,选择查询将具有select ... for update skip locked

\n\n

https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/locking/Locking.html

\n


wwa*_*dge 1

添加:

@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "-2")})