쿼리 힌트(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 정보를 사용하는 비관적 락
'프레임워크 > JPA' 카테고리의 다른 글
[JPA] Entity Graph (1) | 2023.10.24 |
---|---|
[JPA] 임베디드 타입 (1) | 2023.05.01 |
[JPA] 프록시와 연관관계(즉시로딩, 지연로딩, 영속성 전이) (0) | 2023.04.29 |
[JPA] 상속관계 매핑 (0) | 2023.04.23 |
[JPA] 다대일 [N:1] 일대일 [1:1] 다대다 [N:M] (0) | 2023.04.05 |