문제
@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 쿼리 실행 전
- 이 타이밍을 Hibernate 의 FlushMode 클래스에서 설정 가능 (default는 AUTO)
readonly 의 이점
Transactional을 readOnly로 설정하면 Persistence Context에 스냅샷을 저장하지 않음, 또한
Hibernate FlushMode가 MANUAL로 설정되어 플러쉬가 자동으로 일어나지 않음
→ 스냅샷을 저장하지 않으므로 메모리 절약. flush가 일어나지 않음