`@Transactional(readOnly = true)`에대한 질문입니다.

미해결질문
java_oop 프로필

@Transactional(readOnly = true) 속성에 대해서 질문이 있습니다. 기본 Isolation Level 설정은 데이터베이스의 default 속성을 따라가게 되는걸로 알고 있습니다. 만약 mysql을 사용한다면 REPEATABLE_READ level을 택하지만 @Transactional(readOnly = true)을 설정하면 Isolation level이 READE_UNCOMMITED으로 변경되서 성능상의 이점이 있다는 것으로 이해했습니다. 제가 이해한것이 맞을까요?

백기선 프로필
백기선 2019.01.23

같은 질문을 수업 댓글에 남겨주셔서 그쪽에 남긴 댓글을 붙여 넣습니다.

네, isolation 레벨은 별다른 설정을 하지 않으면 DB의 기본값을 따라갑니다. 아시다시피 그 설정은 다른 트랜잭션과의 동시 접속 방법을 제어하는 방법으로 @Transactional 애노테이션에 직접 설정할 수 있습니다. 물론, 설정하더라도 DB가 해당 isolation 레벨을 지원하지 않는다면 적용되지 않겠지만요.

readOnly는 현재 해당 그 트랜잭션 내에서 데이터를 읽기만 할건지 설정하는 겁니다. 이걸 설정하면 DB 중에 read 락(lock)과 write 락을 따로 쓰는 경우 해당 트랜잭션에서 의도치 않게 데이터를 변경하는 일을 막아줄 뿐 아니라, 하이버네이트를 사용하는 경우에는 FlushMode를 Manual로 변경하여 dirty checking을 생략하게 해준다거나 DB에 따라 DataSource의 Connection 레벨에도 설정되어 약간의 최적화가 가능합니다. 아마 이 부분에서 특정 DB는 말씀하신대로 isolation 레벨이 READ_UNCOMMITED 처럼 동작할 여지도 있는 것 같습니다. 그런데 그게 꼭 좋은 건지는 생각해 봐야겠네요. READ_UNCOMMITED 면 팬텀 Read가 가능하단 거니까 isolation level을 명시적으로 선언해야 할지도 모르겠네요.

좋은 질문 감사합니다.

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스