programing

JPA 수준에서 잠긴 업데이트 건너뛰기에 대한 선택

batch 2023. 6. 10. 08:35
반응형

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

반응형