JPA 수준에서 잠긴 업데이트 건너뛰기에 대한 선택
내 애플리케이션 - Oracle with JPA(EclipseLink)에서 다음 식을 사용하여 일부 테이블의 레코드 하위 집합을 잠급니다.
select * from MY_TABLE where MY_CONDITIONS for update skip locked
기본 쿼리를 통해 실행하지만 필요한 모든 엔티티에 대해 해당 쿼리를 작성해야 합니다.
순수 JPA를 사용하여 잠긴 레코드를 건너뛸 수 있는 방법이 있습니까?자체 잠금 정책을 구현할 수 있습니까?
JPA 제공자를 변경해도 상관없지만 JPA API를 사용하고 싶습니다.
최대 절전 모드는 UPGRADE_SKIPLOCKED Lock 모드를 제공합니다.
JPA와 Hibernate를 사용하여 Hibernate LockMode 설명서에 따라 "SKIP_LOCKED"를 생성하려면 다음과 같이 SEPYSTIC_WRITE JPA LockModeType을 결합해야 합니다.
entityManager.find(Department.class, 1, LockModeType.PESSIMISTIC_WRITE);
및 지속성 장치의 persistence.xml과 같은 잠금 시간 초과 설정:
<properties>
<property name="javax.persistence.query.timeout" value="-2"/>
</properties>
(복잡한 쿼리에 대해서도 이 잠금 모드를 구성할 수 있습니다.)
SKIP LOCKED는 ANSI SQL의 일부가 아닙니다.다음과 같은 일부 RDBMS는 이 기능을 특정 기능으로 제공합니다.
따라서 순수 JPA에서는 쿼리에서 "SKIP LOCKED"를 지정할 수 없습니다.실제로 LockModeType에 문서화되어 있듯이 JPA 2.1은 다음만 지원합니다.
- 없음.
- 낙천적인.
- OPTIMIC_FORCE_INCREMENT
- 비관적_FORCE_증분
- 비관적_읽기
- 비관적_쓰기
- 읽어주세요
- 쓰기
그러나 조회에서 SKIP LOCKED를 실행하려면 다음과 같은 방법을 사용할 수 있습니다.
- 위에서 설명한 것처럼 SEPMISTIC_WRITE LockModeType LockTimeout 관련 설정을 조합하여 JPA 쿼리를 통해 SKIP LOCKED를 지정할 수 있는 Hibernate LockMode와 같은 특정 JPA 구현 기능을 사용합니다.
- 수행한 대로 네이티브 SQL 쿼리 생성
스프링 JpaRepository의 경우 다음을 사용할 수 있습니다.
String SKIP_LOCKED = "-2";
@QueryHints(@QueryHint(name = AvailableSettings.JPA_LOCK_TIMEOUT, value = SKIP_LOCKED))
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<YourEntity> fooBar();
Oracle 환경에서 잘 작동하며 다른 시스템에 대해서는 잘 알지 못합니다.
이 게시물이 조금 오래된 것은 알지만, 참고로, 수락된 답변이 언급한 것처럼, "javax.persistence.lock.timeout" (org.hibernate.cfg.AvailableSettings#JPA_LOCK_TIMEOUT
) "-2"로 설정(org.hibernate.LockOptions#SKIP_LOCKED
)를 사용하면 최대 절전 모드가 "SKIP LOCKED"로 표시됩니다.그러나 이 작업은 글로벌 설정을 설정하지 않고도 런타임에 수행할 수 있습니다.
2.0 JPA는 그렇게 힌트를 전달할 수 있기 때문입니다.
entityManager.find(MyType.class, id, LockModeType.PESSIMISTIC_WRITE, new HashMap<String, Object>() {{
put("javax.persistence.lock.timeout", "-2");
}});
Oracle은 읽기 잠금이 필요하지 않으므로 읽기 잠금을 제공하지 않습니다. 실행 취소 로그는 읽기 잠금을 필요로 하지 않습니다.선택...FORUPDATE는 Oracle을 위한 쓰기 잠금에 불과합니다.
JPA를 사용하여 LockModeType을 SEPYSTIC_WRITE로 설정하려고 합니다.
언급URL : https://stackoverflow.com/questions/41434169/select-for-update-skip-locked-from-jpa-level
'programing' 카테고리의 다른 글
벡터에 고유한 값을 R로 나열 (0) | 2023.06.10 |
---|---|
문자열 변수에서 모듈 가져오기 (0) | 2023.06.10 |
data.table에서 키를 설정하는 목적은 무엇입니까? (0) | 2023.06.10 |
다른 모든 요청에 대한 Kubernetes Traefik 내부 서버 오류 (0) | 2023.06.10 |
ggplot은 for 루프 내부에 있으면 작동하지 않지만 외부에서 작동합니다. (0) | 2023.06.10 |