2009-11-01 3 views
32

나는 Locking and Concurrency in Java Persistence 2.0 문서를 읽고 샘플 애플리케이션을 실행했다. 하지만 여전히 PESSIMISTIC_READ와 PESSIMISTIC_WRITE의 차이점을 알지 못합니다. 나는 코드를 수정하려고 노력했다. 그리고 PESSIMISTIC_READ와 PESSIMISTIC_WRITE를 사용하는 코드는 SQL이 "for update"를 호출 할 때와 같은 결과를 가져올 것이다.JPA에서 PESSIMISTIC_READ와 PESSIMISTIC_WRITE의 차이점은 무엇입니까?

답변

13

하나는 읽기 잠금이고 다른 하나는 쓰기 잠금 또는 읽기 또는 업데이트 중 하나입니다.

FTA :

  • PESSIMISTIC_READ. 엔티티 관리자 은 트랜잭션이 엔티티를 읽 자마자 엔티티를 잠급니다. 트랜잭션이 완료 될 때까지 잠금은 입니다. 이 잠금 모드는 이 반복 가능 읽기 의미 체계를 사용하여 데이터를 쿼리하도록하려는 경우에 사용됩니다. 즉, 은 연속적인 읽기간에 데이터가 으로 업데이트되지 않도록하려는 것입니다. 이 잠금 모드는 다른 트랜잭션이 데이터를 읽는 것을 차단하지 않습니다.

    PESSIMISTIC_WRITE. 엔티티 관리자 은 트랜잭션이 엔티티를 업데이트하자마자 엔티티를 잠급니다. 이 잠금 모드는 엔티티 데이터를 업데이트하려고 시도하는 트랜잭션간에 트랜잭션을 직렬화합니다. 이 잠금 모드는 동시 업데이트 트랜잭션 중 업데이트 트랜잭션 중 높은 가능성 ( )이있을 때 자주 사용되는 입니다.

+2

감사합니다. 설명을 보았지만 여전히 혼란 스럽습니다. PESSIMISTIC_READ 및 PESSIMISTIC_WRITE를 사용할 때 항상 "show sql"및 실행 결과에서 동일한 결과를 얻습니다. – paka

+0

좋은 설명!. 시연하기 위해 몇 가지 샘플 코드를 추가 할 수 있습니까? – Velu

+0

@paka : JPA 사양에서는 "구현시 LockModeType.PESSIMISTIC_WRITE를 사용할 수 있지만 LockModeType.PESSIMISTIC_READ가 요청 된 곳에서는 허용되지만 그 반대는 허용되지 않습니다." 자세한 내용은 [이 답변보기] (http://stackoverflow.com/a/33081311/3994580)를 참조하십시오. – DaniEll

5

스펙을 사용하면 JPA 구현에서 서로 다른 유형의 데이터베이스 잠금을 사용할 수 있습니다. 대부분의 데이터베이스는 하나의 유형의 선언적 잠금 만 가지므로 대부분의 구현에서 두 데이터베이스가 동일합니다 (차이점은 없습니다).

28

차이점은 잠금 메커니즘에 있습니다.

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 독점 (쓰기) 잠금을 획득하면서

JPA 2.1

5

PESSIMISTIC_READ는 관련 테이블 행 기록의 공유 (읽기) 잠금을 획득합니다.

공유 잠금은 다른 동시 배타적 잠금 요청을 차단하지만 다른 공유 잠금 요청이 진행되도록 허용합니다.

독점 잠금은 공유 및 단독 잠금 요청을 차단합니다.

Hibernate의 경우 데이터베이스가 공유 잠금 (예 : Oracle)을 지원하지 않으면 공유 잠금 요청 (PESSIMISTIC_READ)은 배타적 잠금 요청 (PESSIMISTIC_WRITE)을 간단히 획득합니다.

자세한 내용은 this article about locksthis article about JPA pessimistic lock types을 확인하십시오.

관련 문제