1. JPA Hint
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
@Test
public void queryHint() {
//given
Member member1 = memberRepository.save(new Member("member1", 10));
em.flush(); //sql 쿼리 실행
em.clear(); //영속성 컨텍스트 초기화
//when
Member findMember = memberRepository.findReadOnlyByUsername("member1"); //쿼리 힌트를 통해 readOnly인 경우(업데이트x)
// Member findMember = memberRepository.findById(member1.getId()).get(); //일반적인 변경감지가 일어나는 경우(업데이트o)
findMember.setUsername("member1Change");
em.flush();
}
@QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly",
value = "true")},
forCounting = true)
Page<Member> findByUsername(String name, Pagable pageable);
사실상 실무에서는 사용빈도가 높지 않음. 트래픽 분석을 통해 필요한 경우에만 사용해도 충분
2. Lock
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findByUsername(String name);