[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.더하다:
더하다:
-
==============================
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
from https://stackoverflow.com/questions/46208705/spring-data-jpa-native-query-skip-locked by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 주석 @Autowired는 어떻게 작동합니까? (0) | 2019.08.15 |
---|---|
[SPRING] 스프링 빈 초기화 시간을 계산할 수 있습니까? (0) | 2019.08.14 |
[SPRING] 스프링 클라우드를 사용하여 유레카 서버의 기본 포트 변경 (0) | 2019.08.14 |
[SPRING] 현재 스레드에 대한 트랜잭션 동기화 세션을 얻을 수 없습니다 (0) | 2019.08.14 |
[SPRING] Spring Data JPA를 사용하여 하나의 열을 선택하십시오. (0) | 2019.08.14 |