JPA

JPA 낙관적 락(부제 - OPTIMISTIC)

쿠카이든 2022. 6. 22. 10:02
728x90
OPTIMISTIC
@Version만 적용했을 때는 엔티티를 수정해야 버전을 체크하지만 이 옵션을 추가하면 엔티티를 조회만 해도 버전을 체크한다. 한 번 조회한 엔티티는 트랜잭션을 종료할 때까지 다른 트랜잭션에서 변경되지 않음을 보장한다.
 
  • 용도 : 조회 시점부터 트랜잭션이 끝날 때까지 조회한 엔티티가 변경되지 않음을 보장한다.
  • 동작 : 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다(SELECT 쿼리 사용). 만약 같지 않으면 예외가 발생한다.
  • 이점 : OPTIMISTIC 옵션은 DIRTY READ와 NON-REPEATABLE READ를 방지한다.
    • DIRTY READ : 커밋되지 않은 데이터를 읽을 수 있다. 예를 등러 트랜잭션1이 데이터를 수정하고 있는데 커밋하지 않아도 트랜잭션 2가 수정 중인 데이터를 조회할 수 있다.
    • NON-REPEATABLE READ : 커밋한 데이터만 읽을 수 있다. 반복해서 같은 데이터를 읽을 수 없는 상태를 의미한다.
    • 데이터베이스들은 보통 Dirty READ는 허용하지 않지만 READ COMMITED는 허용하는 격리 수준을 기본으로 사용한다. 

OPTIMISTIC 개념도

 

출처 : JAVA 표준 ORM JPA 프로그래밍 (저자 김영한)

그림 출처 : https://www.nowwatersblog.com/jpa/ch16/16-1

728x90