[JPA] 락 사용방법 및 종류

JPA 에서 락 사용 권장 전략

  1. 격리 레벨의 READ_COMMITTED 설정
    1. 트랜잭션이 커밋된 데이터만 읽을 수 있음
  1. 낙관적 버전 관리
    1. 데이터의 버전을 추적해 동시 수정을 방지하는 전략
    1. 버전 충돌이 발생하면 예외가 발생한다.

개인적 락에 대한 생각

  • 개인적으로는 비관적락을 지금은 선호한다.
  • 대부분 개발한 사이트를 보면 사용자가 그렇게 많이 않을 뿐더러
  • 비관적락을 사용해도 성능에 문제가 없었기 때문이다.
  • 근데 만약 동시 사용자가 많은 경우에는 위 전략처럼 사용해야 할 것 같다.

JPA 에서의 락 적용 위치

  1. EntityManager 사용: EntityManager.lock(), EntityManager.find(), EntityManager.refresh() 메소드를 통해 락을 적용할 수 있습니다.
  1. Query 사용: Query.setLockMode() 메소드를 사용해 쿼리 실행 시 락을 적용할 수 있습니다.
  1. @NamedQuery: Named Query에 락 모드를 지정할 수 있습니다.

LockModeType 속성

  • OPTIMISTIC: 낙관적 락을 사용한다.
  • OPTIMISTIC_FORCE_INCREMENT: 낙관적 락을 사용하고, 버전 정보를 강제로 증가한다.
  • PESSIMISTIC_READ: 비관적 락, 읽기 락을 사용한다.
    • SELECT FOR UPDATE 베타락과 같다.
  • PESSIMISTIC_WRITE: 비관적 락, 쓰기 락을 사용한다.
    • SELECT FOR SHARE 공유락과 같다.
  • PESSIMISTIC_FORCE_INCREMENT: 비관적 락을 사용하고, 버전 정보를 강제로 증가한다.
  • NONE: 락을 걸지 않는다.
  • READ: JPA 1.0 호환 기능, OPTIMISTIC과 동일하다.
  • WRITE: JPA 1.0 호환 기능, OPTIMISTIC_FORCE_INCREMENT와 동일하다.


Uploaded by N2T