자바/JPA
[JPA] 락 사용방법 및 종류
OverTheHorizon3410
2023. 11. 21. 23:17
JPA 에서 락 사용 권장 전략
- 격리 레벨의 READ_COMMITTED 설정
- 트랜잭션이 커밋된 데이터만 읽을 수 있음
- 낙관적 버전 관리
- 데이터의 버전을 추적해 동시 수정을 방지하는 전략
- 버전 충돌이 발생하면 예외가 발생한다.
개인적 락에 대한 생각
- 개인적으로는 비관적락을 지금은 선호한다.
- 대부분 개발한 사이트를 보면 사용자가 그렇게 많이 않을 뿐더러
- 비관적락을 사용해도 성능에 문제가 없었기 때문이다.
- 근데 만약 동시 사용자가 많은 경우에는 위 전략처럼 사용해야 할 것 같다.
JPA 에서의 락 적용 위치
- EntityManager 사용:
EntityManager.lock()
,EntityManager.find()
,EntityManager.refresh()
메소드를 통해 락을 적용할 수 있습니다.
- Query 사용:
Query.setLockMode()
메소드를 사용해 쿼리 실행 시 락을 적용할 수 있습니다.
- @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