@Transactional readOnly란?
- 해당
트랜잭션이 읽기 전용인 경우 사용
합니다.
@Transactional readOnly를 사용하는 이유
- 조회 작업만 수행한다는 것을
명시적으로 나타낼 수 있습니다.
- 런타임에 트랜잭션과 관련한
최적화 기능을 제공
합니다.
- 제공하는
최적화 기능은 JDBC 드라이버마다 다르며 아무 일도 일어나지 않을 수 있습니다.
따라서 힌트 기능만 제공합니다.
Hibernate를 사용하는 경우
- 스프링에서 하이버네이트의 플러시 모드를 MANUAL(직접 flush 메서드를 호출해야 flush가 실행되는 방식)로 설정하여 트랜잭션이 커밋되어도
Dirty Checking을 하지 않습니다.
Dirty Checking
을 위한 스냅샷도 만들지 않습니다.
MySQL을 사용하는 경우
- MySQL의 auto commit 옵션이 활성화되어 있는 경우 실행한 쿼리마다 커밋을 하지만 @Transactional을 사용하는 경우 auto commit 옵션을 비활성화하기 때문에
커밋 횟수를 줄여서 자원을 아낄 수 있습니다.
- 트랜잭션 ID가 부여되지 않아서
트랜잭션 ID 설정에 대한 오버헤드를 아낄 수 있습니다.
- 데이터 변경과 같이 조회가 아닌 작업을 하는 경우 에러를 발생시킵니다. (SELECT 쿼리만 실행 가능)
- @Transactional의 readOnly 옵션이 true인 경우에 아래와 같이 MySQL의 MySQL Transaction Read Only 기능을 사용하기 때문에 바로 위의 두 가지 장점을 얻을 수 있습니다.
readOnly = true 로그
readOnly = false 로그
Reference
https://perfectacle.github.io/2021/08/08/readonly-transaction-doesnt-make-entity-snapshot/#3줄-요약