JPA Lock 설정

h블로그·2021년 8월 4일
0

Lock

테이블 데이터 충돌을 위한 lock 처리하는 방법들에 대한 설명이다.

낙관적 락 (Optimistic Lock)

대부분 충돌이 발생하지 않을 것이라는 가정하는 락 방식이다.

동시 요청으로 충돌 가능성이 낮은 경우에 예외를 발생한다.

잠금이라기보다 충돌감지에 가깝다.

OptimisticLockException 예외가 발생한다.

모드

  • OPTIMISTIC (Read)
  • OPTIMISTIC_FORCE_INCREMENT (Write)

예시

@Entity 
public class User {
    ..
    
    @Version 
    private int version; 
}

@Version만 작성해도 된다.
엔터티를 수정할 때 조회한 버젼과 같은지 확인한다. 만약 버젼이 같지 않으면 예외를 발생시킨다.

비관적 락 (Pessimstic Lock)

동시에 데이터를 수정할 가능성이 높다는 비관적인 전제를 가진 락 방식이다. 선점 잠금이라고 부르기도 한다.

동시 요청으로 충돌하지 않도록 정합성을 보장한다.

하지만, 성능적인 측면에서 손실을 감수해야 한다.

모드

  • PESSIMISTIC_READ : Shared Lock 을 얻고 업데이트, 삭제되지 않는다.
  • PESSIMISTIC_WRITE : Exclusive Lock(데이터베이스에서 제공하는 베타잠금) 얻고 읽기, 업데이트, 삭제되지 않는다.
  • PESSIMISTIC_FORCE_INCREMENT : PESSIMISTIC_WRITE 와 유사하며 엔터티의 버전 속성을 추가로 증가시킨다.

예시

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select u from user u")
User findUsers();
profile
😎🙈🙈🙈🤓

0개의 댓글