[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 |