작성
·
561
1
선생님의 강의를 보면서 정말 실무에서 몰랐으면 고생했을 내용을 많이 알게되어서 도움이 많이되었습니다.^^ OSIV같은 성능 최적화를 위한 설정 부분에 대해서 알게 되어서 너무나도 기쁩니다. 사실 다름이아니고 전부터 궁금했던 부분인데 @Transactional(read only =true) 로 설정하면 읽기 전용으로 설정이되어서 CRUD에서 R을 제외한 나머지 작업은 안되는걸로 알고있는데 정확하게 어떻게 동작하는지 메커니즘이 궁금합니다. 제가 찾아봤을때는 read only = true로 설정하면 트랜잭션 커밋 직전에 영속컨텍스트에서 플러시를 호출하지 않는 걸로아는데 ... 이게 정확한 정보인지 궁금합니다.
답변 1
10
안녕하세요 a79007714님 좋은 질문입니다^^
우선 정확한 정보가 맞습니다. ㅎㅎ
@Transactional(readOnly =true)를 설정하면 다음과 같은 일을 합니다.
1. 데이터베이스 커넥션에 읽기 전용 정보를 넘겨줍니다.
2. 트랜잭션 커밋시점에 플러시를 호출하지 않습니다.
1번에서 데이터베이스에 커넥션에 읽기 전용 정보를 넘겨주기는 하는데, 데이터베이스 드라이버 구현체마다 동작 방식이 다르기 때문에(아무런 동작도 하지 않는 경우도 많다고 합니다.) 이렇게 설정을 해도 실제 데이터베이스에 INSERT가 될 수도 있습니다. 이것으로 인한 최적화로 효과를 얻었다는 부분은 저도 아직 들어보지 못했습니다. (혹시 들으면 알려주세요 ㅠㅠ)
2번에서 플러시를 하지 않기 때문에 더티 체킹 같은 부분이 생략됩니다. 따라서 성능 최적화가 일어납니다. 추가로 플러시를 하지 않기 때문에 엔티티를 변경해도 변경내용이 반영되지 않습니다.
감사합니다^^!