나는 Locking and Concurrency in Java Persistence 2.0 문서를 읽고 샘플 애플리케이션을 실행했다. 하지만 여전히 PESSIMISTIC_READ와 PESSIMISTIC_WRITE의 차이점을 알지 못합니다. 나는 코드를 수정하려고 노력했다. 그리고 PESSIMISTIC_READ와 PESSIMISTIC_WRITE를 사용하는 코드는 SQL이 "for update"를 호출 할 때와 같은 결과를 가져올 것이다.JPA에서 PESSIMISTIC_READ와 PESSIMISTIC_WRITE의 차이점은 무엇입니까?
답변
하나는 읽기 잠금이고 다른 하나는 쓰기 잠금 또는 읽기 또는 업데이트 중 하나입니다.
FTA :
PESSIMISTIC_READ. 엔티티 관리자 은 트랜잭션이 엔티티를 읽 자마자 엔티티를 잠급니다. 트랜잭션이 완료 될 때까지 잠금은 입니다. 이 잠금 모드는 이 반복 가능 읽기 의미 체계를 사용하여 데이터를 쿼리하도록하려는 경우에 사용됩니다. 즉, 은 연속적인 읽기간에 데이터가 으로 업데이트되지 않도록하려는 것입니다. 이 잠금 모드는 다른 트랜잭션이 데이터를 읽는 것을 차단하지 않습니다.
PESSIMISTIC_WRITE. 엔티티 관리자 은 트랜잭션이 엔티티를 업데이트하자마자 엔티티를 잠급니다. 이 잠금 모드는 엔티티 데이터를 업데이트하려고 시도하는 트랜잭션간에 트랜잭션을 직렬화합니다. 이 잠금 모드는 동시 업데이트 트랜잭션 중 업데이트 트랜잭션 중 높은 가능성 ( )이있을 때 자주 사용되는 입니다.
스펙을 사용하면 JPA 구현에서 서로 다른 유형의 데이터베이스 잠금을 사용할 수 있습니다. 대부분의 데이터베이스는 하나의 유형의 선언적 잠금 만 가지므로 대부분의 구현에서 두 데이터베이스가 동일합니다 (차이점은 없습니다).
차이점은 잠금 메커니즘에 있습니다.
PESSIMISTIC_READ
잠금은 이러한 잠금이있을 때 더티 읽기 및 반복 불가능 읽기가 불가능 함을 의미합니다. 데이터를 변경해야하는 경우 더럽고 비 반복 읽기 외에 (단독 잠금을 기다리는 동안 deadlocks
가능) 추가 잠금을 획득하지 않고 데이터를 업데이트 할 수없는 것을 PESSIMISTIC_WRITE
잠금을
PESSIMISTIC_WRITE
잠금 보증을 받아야합니다.
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║ LockModeType ║ PESSIMISTIC_READ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ type ║ SHARED LOCK ║ EXCLUSIVE LOCK ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ isReadOnly without ║ ║ ║
║ additional locks ║ YES ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ dirty reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ non-repeatable reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ how to update data ║ obtain PESSIMISTIC_WRITE ║ ALLOWED ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ no one holds ║ no one holds ║
║ how to obtain lock ║ PESSIMISTIC_WRITE ║ PESSIMISTIC_READ or ║
║ ║ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ ║ when there is a high ║
║ ║ you want to ensure no ║ likelihood of deadlock or║
║ when to use ║ dirty or non-repeatable ║ update failure among ║
║ ║ reads are possible ║ concurrent updating ║
║ ║ ║ transactions ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝
관련 자료 : PESSIMISTIC_WRITE
독점 (쓰기) 잠금을 획득하면서
PESSIMISTIC_READ
는 관련 테이블 행 기록의 공유 (읽기) 잠금을 획득합니다.
공유 잠금은 다른 동시 배타적 잠금 요청을 차단하지만 다른 공유 잠금 요청이 진행되도록 허용합니다.
독점 잠금은 공유 및 단독 잠금 요청을 차단합니다.
Hibernate의 경우 데이터베이스가 공유 잠금 (예 : Oracle)을 지원하지 않으면 공유 잠금 요청 (PESSIMISTIC_READ
)은 배타적 잠금 요청 (PESSIMISTIC_WRITE
)을 간단히 획득합니다.
자세한 내용은 this article about locks 및 this article about JPA pessimistic lock types을 확인하십시오.
- 1. JPA에서 집계 및 분해
- 2. JPA에서 Hibernate UserTypes를 사용하는 방법은 무엇입니까?
- 3. JPA에서 '일대일'관계를 지정하는 것의 의미는 무엇입니까?
- 4. JPA에서 어떻게 Hibernate의 saveOrUpdate를 복제 할 수 있습니까? JPA에서
- 5. JPA에서 DISTINCT 사용
- 6. JPA에서 i18n 테이블 매핑
- 7. JPA @GeneratedValue ID에 JPA에서
- 8. JPA에서 교차 데이터베이스 조인
- 9. JPA에서 예제로 기능 구현하기
- 10. JPA에서 MySQL 데이터베이스 쿼리하기
- 11. jpa에서 시퀀스의 다음 값 호출
- 12. JPA에서 저장소를 처리하는 표준 방법
- 13. Hibernate/JPA에서 선택적으로 캐스케이드 사용하기
- 14. 엔티티 JPA에서 감사 정보 남기기
- 15. JPA에서 메모리 내 데이터 쿼리
- 16. JPA에서 SQL 삽입 공격이 가능합니까?
- 17. JPA에서 위조 술부를 만드는 방법
- 18. JPA에서 객체 그래프의 사이클이 감지되었습니다.
- 19. JPA에서 관리 객체를 생성/편집해야합니까?
- 20. JPA에서 외래 키를 고유하게 만들기
- 21. JPA에서 데이터베이스 변경 사항을 인식하도록하십시오.
- 22. JPA에서 사소한 제약 조건을 표현하지 마십시오.
- 23. Databinder.Eval과 Container.DataItem의 차이점은 무엇입니까?
- 24. static_cast와 Implicit_cast의 차이점은 무엇입니까?
- 25. NSNumber와 NSInteger의 차이점은 무엇입니까?
- 26. Phing과 PHPUnderControl의 차이점은 무엇입니까?
- 27. WPF와 WinForms의 차이점은 무엇입니까?
- 28. CreateWnd와 CreateWindowHandle의 차이점은 무엇입니까?
- 29. ImageMagick과 GraphicsMagick의 차이점은 무엇입니까?
- 30. Pingback과 Trackback의 차이점은 무엇입니까?
감사합니다. 설명을 보았지만 여전히 혼란 스럽습니다. PESSIMISTIC_READ 및 PESSIMISTIC_WRITE를 사용할 때 항상 "show sql"및 실행 결과에서 동일한 결과를 얻습니다. – paka
좋은 설명!. 시연하기 위해 몇 가지 샘플 코드를 추가 할 수 있습니까? – Velu
@paka : JPA 사양에서는 "구현시 LockModeType.PESSIMISTIC_WRITE를 사용할 수 있지만 LockModeType.PESSIMISTIC_READ가 요청 된 곳에서는 허용되지만 그 반대는 허용되지 않습니다." 자세한 내용은 [이 답변보기] (http://stackoverflow.com/a/33081311/3994580)를 참조하십시오. – DaniEll