복붙노트

[SPRING] 스프링 데이터 JPA 기본 쿼리 건너 뛰기 잠김

SPRING

스프링 데이터 JPA 기본 쿼리 건너 뛰기 잠김

Spring Data JPA를 사용하여 Oracle에서 SKIP LOCKED 쿼리를 실행하고 싶기 때문에 다음을 시도했습니다.

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

위의 시도를하고 생성 된 쿼리에 FOR UPDATE가 포함되어 있지만 SKIP LOCKED가 아니라는 것을 알았습니다 (로그에서 생성 된 쿼리 아래).

select ent0_.column1 as name, ent0_.CREATED_DATE as CREATED_2_33_0_ from TABLE_NAME alias_name where ent0_.column1=? for update

쿼리 메서드에서 @Lock을 제거하면 생성 된 쿼리에도 FOR UPDATE가 없습니다.

필요에 따라 FOR UPDATE SKIP LOCKED로 쿼리를 생성하는 방법을 제안하십시오.

해결법

  1. ==============================

    1.더하다:

    더하다:

  2. ==============================

    2.타임 아웃 값에 -2를 할당하면 가능할 때마다 '건너 뛰기'가 사용됩니다.

    타임 아웃 값에 -2를 할당하면 가능할 때마다 '건너 뛰기'가 사용됩니다.

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

    이렇게하면 select 쿼리에 select ...가 있습니다.

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

  3. from https://stackoverflow.com/questions/46208705/spring-data-jpa-native-query-skip-locked by cc-by-sa and MIT license