caffeine-library/pro-spring-5

[question] JPA Lock과 DB Lock

Closed this issue · 3 comments

질문

JPA Lock과 DB Lock

상세 내용

책 p.537에서, @Version 애너테이션을 적용한 애트리뷰트 값을 낙관적 잠금(Optimistic Locking) 메커니즘에 사용한다고 합니다.

이와 관련해서 JPA의 Lock을 조사해보니 JPA의 Lock에는 낙관적 잠금(Optimistic Locking)과 비관적 잠금(Pessimistic Locking) 이 존재한다고 하는데, 각각에 대해 조사해보면 좋을 것 같습니다.

또한, Lock과 관련해서 데이터베이스의 Lock이라는 키워드도 생각이 나는데, 이것도 함께 조사해보면 좋을 것 같습니다. 😄

연관 챕터

#57

참고

JPA Lock - JPA에서 Optimistic Lock과 Pessimistic Lock
DB Lock - Lock으로 이해하는 Transaction의 Isolation Level

문제 상황

비관적 잠금 (Pessimistic Lock, 선점 잠금)

Order order = entityManager.find(Order.class, orderNo, LockModeType.PESSIMISTIC_WRITE);

교착상태 가능성

  1. 스레드 1: A 정보를 구하고 잠금
  2. 스레드 2: B 정보를 구하고 잠금
  3. 스레드 1: B 정보를 구하고자할 때 블로킹
  4. 스레드 2: A 정보를 구하고자할 때 블로킹

교착 상태 해결

최대 잠금 시간 지정

낙관적 잠금 (Optimistic Lock, 비선점 잠금)

  • 잠금(Lock)하지 않음
  • version 불일치 시 트랜잭션 커밋 실패
@Entity
@Table(name = "order")
public class Order {
    ...   
    @Version
    private long version;   
    ...
}
  • @Version을 붙여주면, 별도의 로직을 작성할 필요 없이
    낙관적 잠금을 위해 필요한 코드 또는 쿼리를 자동 생성해 줌

DB Lock 추가 설명이 필요합니다~

#71 참고