본문 바로가기
프레임워크/JPA

[JPA] Hint & Lock

by so5663 2024. 2. 23.

쿼리 힌트(JPA Hint) 사용하는 이유

영속성 컨텍스트Dirty Checking(변경 감지)을 해서 트랜잭션이 끝나는 시점에 자동으로 엔티티를 업데이트 하는데 

이럴 경우 의도하지 않아도 업데이트 되는 걸 방지 하기 위해서 사용한다.

 

쿼리 힌트 사용

@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);

 

쿼리 힌트 사용 확인

@Test
public void queryHint() throws Exception {
 //given
 memberRepository.save(new Member("member1", 10));
 em.flush();
 em.clear();
 //when
 Member member = memberRepository.findReadOnlyByUsername("member1");
 member.setUsername("member2");
 em.flush(); //Update Query 실행X
}

 

 

Lock

  • 트랜잭션끼리의 충돌이 발생한다고 가정하고 우선 락을 거는 방법
  • DB에서 제공하는 락기능을 사용
  • 선점 잠금이라고 불리기도 함
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findByUsername(String name);

 

LOCKMode 종류

  • LockModeType.PESSIMISTIC_WRITE
    일반적인 옵션. 데이터베이스에 쓰기 락
    다른 트랜잭션에서 읽기도 쓰기도 못함. (배타적 잠금)
  • LockModeType.PESSIMISTIC_READ
    반복 읽기만하고 수정하지 않는 용도로 락을 걸 때 사용
    다른 트랜잭션에서 읽기는 가능함. (공유 잠금)
  • LockModeType.PESSINISTIC_FORCE_INCREMENT
    Version 정보를 사용하는 비관적 락