@Transactional readOnly 옵션

Louie·2023년 2월 24일
0

@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줄-요약

profile
백엔드 개발자를 준비하고 있는 Louie입니다.

0개의 댓글