[실전! 스프링 데이터 JPA] @QueryHints & @Lock

강신현·2022년 8월 12일
0

@QueryHints

JPA 구현체에게 제공하는 힌트로, 아래처럼 성능 최적화를 위해 객체를 읽기 전용으로 가져오는 등으로 사용한다.

  • MemberRepository
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
  • MemberRepositoryTest
@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에서 제공하는 락기능을 사용)

  • 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)/

profile
땅콩의 모험 (server)

0개의 댓글