해결상태로 바꾸려면 클릭
1명이 이 질문을 좋아합니다!

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

java_oop
 · 2019.01.23

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

해결상태로 바꾸려면 클릭
1명이 이 질문을 좋아합니다!
A 총 1개의 답변이 달렸습니다
1
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을 명시적으로 선언해야 할지도 모르겠네요.

좋은 질문 감사합니다.

댓글

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