JPA Optimistic/Pessimistic Lock

Sixhustle·2021년 7월 26일
0

JPA

목록 보기
2/2

낙관적 잠금(Optimistic Lock)

데이터 갱신시 일관성 문제가 없을 것이라 낙관적으로 생각

본인 외에도 다른 사람이 해당 데이터를 읽고/변경할 수 있습니다.
따라서 데이터를 수정하는 시점에 다른 사용자에 의해 데이터가 변경되었는지 변경 여부를 확인해야합니다.

JPA Optimistic Lock

@Entity
public class Entity {
   ...
   @Version
   private Integer version;
}

특정 필드에 @Version annotation을 추가하여 optimistic lock을 사용할 수 있습니다.
필드의 data type으로는 아래의 7가지를 사용할 수 있습니다.

  1. int
  2. short
  3. long
  4. Integer
  5. Short
  6. Long
  7. java.sql.Timestamp

commit시 version정보가 변경되어 있으면 OptimisticLockException이 발생합니다.

LockMode Type

1. NONE

Entity에 @Version이 적용된 필드만 있으면 optimistic lock이 적용됩니다.

2. OPTIMISTIC, READ

Entity 읽기시에도 버전을 체크하여 transaction이 종료될 때까지 데이터 변경이 없었음을 보장합니다.
이를 통해 dirty readnon-repeatable read를 방지합니다.

3. OPTIMISTIC_FORCE_INCREMENT, WRITE

optimistic lock을 사용하면서 버전 정보를 강제로 증가시킵니다.


비관적 잠금(Pessimistic Lock)

데이터 갱신시 일관성 문제가 발생할 것이라 비관적으로 생각

lock을 걸어 본인 외에는 다른 사람이 데이터를 읽을 수 없게 하는 것입니다.

1. exclusive lock : 누군가 데이터를 읽고(사용)있다면, 다른 사람(transaction)은 해당 데이터에 접근할 수 없습니다.
2. shared lock : 다른 사람이 동시에 데이터를 읽을 수 있지만, 변경할 수는 없습니다.

JPA Pessimistic Lock

LockMode Type

1. PESSIMISTIC_READ

Shared Lock을 얻고, 데이터를 읽을 순 있지만 업데이트/삭제를 방지합니다.

2. PESSIMISTIC_WRITE

Exclusive Lock을 얻고, 데이터를 읽기/업데이트/삭제를 방지합니다.

Exception

1. PersistenceException : lock을 가져오는데 실패할 경우
2. LockTimeoutException : lock을 기다리다가 wait time을 지났을 경우


References

0개의 댓글