JPA 구현체에게 제공하는 힌트로, 아래처럼 성능 최적화를 위해 객체를 읽기 전용으로 가져오는 등으로 사용한다.
@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
}
트랜잭션끼리의 충돌이 발생한다고 가정하고 우선 락을 거는 방법 (DB에서 제공하는 락기능을 사용)
LockModeType.PESSIMISTIC_WRITE
일반적인 옵션. 데이터베이스에 쓰기 락
다른 트랜잭션에서 읽기도 쓰기도 못함. (배타적 잠금)
LockModeType.PESSIMISTIC_READ
반복 읽기만하고 수정하지 않는 용도로 락을 걸 때 사용
다른 트랜잭션에서 읽기는 가능함. (공유 잠금)
LockModeType.PESSINISTIC_FORCE_INCREMENT
Version 정보를 사용하는 비관적 락
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findLockByUsername(String name);
[인프런 - 김영한] 실전! 스프링 데이터 JPA
https://isntyet.github.io/jpa/JPA-%EB%B9%84%EA%B4%80%EC%A0%81-%EC%9E%A0%EA%B8%88(Pessimistic-Lock)/