낙관적 락 vs 비관적 락

bp.chys·2021년 6월 3일
0

TIL(Today I Learned)

목록 보기
5/11

낙관적 락

  • 트랜잭션 대부분은 충돌이 발생하지 않는다고 낙관적으로 가정하는 방법이다.
  • 낙관적 락은 트랜잭션을 커밋하기 전까지는 트랜잭션의 충돌을 알 수 없다는 특징이 있다.
  • JPA가 제공하는 버전 관리 기능을 사용한다.

@Version

  • 엔티티 특정 필드에 @Version 어노테이션을 추가하면, 엔티티 내용이 수정될 때마다 버전이 1씩 증가한다.
  • 조회 시점의 엔티티 version과 커밋 시점의 데이터베이스 version을 비교하여 다르면 예외가 발생한다.
  • 최초 커밋만 인정한다.
  • 벌크연산을 하는 경우 version이 증가하지 않는다.

옵션

  • OPTIMISTIC: 한 번 조회한 엔티티는 트랜잭션을 종료할 때까지 다른 트랜잭션에서 변경하지 않음을 보장
    • 엔티티를 수정하지 않고 단순히 조회만 해도 버전을 확인한다.
    • 반복 읽기를 가능하게 한다.
  • OPTIMISTIC_FORCE_INCREMENT: 낙관적 락을 사용하면서 버전 정보를 강제로 증가
    • 엔티티를 직접적으로 수정하지 않아도 연관관계 객체가 추가되거나 수정될 경우 강제로 증가시킨다.

비관적 락

  • 트랜잭션의 충돌이 발생한다고 가정하고 우선 락을 걸고 보는 방법이다.
  • 이것은 데이터베이스가 제공하는 락 기능을 사용한다.

옵션

  • PESSIMISTIC_WRITE: 기본 옵션, 데이터베이스에 쓰기 락을 건다.
    • SELECT FOR UPDATE를 사용해서 락을 건다. 이중 수정 불가
  • PESSIMISTIC_READ: 반복 읽기를 위한 용도, 잘 사용되지는 않는다.
profile
하루에 한걸음씩, 꾸준히

0개의 댓글