[JPA] @Transactional (readOnly = True) 를 쓰는 이점

GuruneLee·2023년 1월 1일
0

Let's Study 공부해요~

목록 보기
27/36
post-thumbnail

문제

@Transaction 사용시, readonly 플래그에 대한 이해가 없이 피상적으로 사용하고 있다고 느껴 정리함

기반 지식

Hibernate PersistentContext

  • entity instance를 저장/관리함
    • persistent entity instance (managed entity)
    • instance마다 @id로 관리 → 동일성 보장
  • snap shot 저장 + dirty check (변경된 entity를 감지, commit 대상으로 포함)
    • 엔터디 당 필드바이필드로 비교 (연관 관계가 있으면 그것까지 다 검사함)
  • 쓰기지연
  • 지연로딩
  • db와 service 사이의 cache역할
    • 트랜잭션 격리 레벨 중 REPEATABLE READ와 같은 격리수준을 누릴 수 있지만, 비용이 더 적음 ( 한 트랜잭션 내에서 실행하는 같은 SELECT구문은 같은 쿼리 결과를 가져와야 한다)

flush

  • persistent context 변경 내용을 db에 동기화
  • INSERT, DELETE, UPDATE 내역이 있어, 변경사항이 감지가 되면 (dirty check에서 걸리는게 있으면) flush 수행 → 내역 존재 라기보단 '변경 감지'할 때
  • flush 수행 타이밍 : entity manger가 직접 호출 / 트랜잭션 commit 시 / JPQL 쿼리 실행 전
    • 이 타이밍을 HibernateFlushMode 클래스에서 설정 가능 (default는 AUTO)

readonly 의 이점

Transactional을 readOnly로 설정하면 Persistence Context에 스냅샷을 저장하지 않음, 또한
Hibernate FlushMode가 MANUAL로 설정되어 플러쉬가 자동으로 일어나지 않음

→ 스냅샷을 저장하지 않으므로 메모리 절약. flush가 일어나지 않음

profile
Today, I Shoveled AGAIN....

0개의 댓글