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
'자바 > JPA' 카테고리의 다른 글
[Qdsl, JPA] @PersistenceContext 의 역할 (0) | 2024.02.21 |
---|---|
Jpa 에서 `@mappedBy` ? (0) | 2024.02.19 |
[JPA] 낙관적 락 옵션 (0) | 2023.11.21 |
[JPA]@Version 어노테이션에 대해여 (0) | 2023.11.21 |
[JPA] 두 번의 갱신 분실 문제 (Second Lost Updates Problem) (0) | 2023.11.19 |