Open utterances-bot opened 4 months ago
데이터 조회가 안되는 문제의 해결 과정과 auto-commit과 open-in-view 설정에 대해 자세히 작성해주셔서 정말 재밌게 읽었습니다!
innerMethod에서 @Transactional(readonly=true)
설정을 지웠다는 내용이 없기에, 트랜잭션이 중첩된 것으로 생각했습니다. 트랜잭션 중첩에 대해서는 어떻게 생각하시는지 궁금합니다.
COMMIT과 관련된 문단에서는 COMMIT , ROLLBACK , BEGIN 모두 동일하게 Snapshot 을 갱신 해주는 역할을 해요.
라고 작성해주셨는데, open-in-view 문단에서는 COMMIT 이 실행되어 ROLLBACK 이 실행되지 않았고, Snapshot도 갱신되지 않았어요😢
라고 적혀있습니다.
이 문장은 Snapshot의 갱신 시점이 API 종료 시점이기에 위와 같이 작성하신 게 맞을까요?
@dl-00-e8 님, 안녕하세요😀 글 재미있게 읽어주셔서 감사합니다!
innerMethod에서 @Transactional(readonly=true)
설정을 지웠다는 내용이 없기에, 트랜잭션이 중첩된 것으로 생각했습니다. 트랜잭션 중첩에 대해서는 어떻게 생각하시는지 궁금합니다.
맞습니다! innerMethod 에@Transactional(readonly=true)
설정은 유지하고, 상위 메서드에 @Transactional(readonly=true)
을 추가하여 내부 트랜잭션은 상위에 존재하는 트랜잭션에 참여하도록 하였습니다.
이 문장은 Snapshot의 갱신 시점이 API 종료 시점이기에 위와 같이 작성하신 게 맞을까요?
제가 Master Session 과 Slave Session 을 혼용해서 사용해서 이해하는데 어려움이 있을 것 같아요.
위 프로젝트는 MariaDB Connector/J 의 aurora 모드를 사용하고 있어, @Transactional(readonly=true)
설정이 있는 innerMethod 의 경우 Slave Session 에서 실행됩니다. 따라서 Slave Session 의 스냅샷은 매번 갱신되는데요, Master Session 의 스냅샷은 갱신되지 않습니다. Master Session 에서 Commit 이 발생하지 않았다면, ROLLBACK 이 실행되어 그 결과로 Master Session 의 스냅샷이 갱신되었겠죠?! 하지만 ROLLBACK 은 실행되지 않았어요.
이유는 @Transactional(readonly=true)
에 의해 실행된 COMMIT 으로 인해(Slave Session 에서 실행), Connection 종료 시에 COMMIT 이 발생한 것으로 판단하고 해당 Connection 을 ROLLBACK 시키지 않습니다. Master Session 은 COMMIT 이나 ROLLBACK 둘다 발생하지 않게 되어 스냅샷이 갱신되지 않게 됩니다.
느낌적인 느낌(?)으로 트랜잭션을 적용해서 바로 해결되고 끝내버릴 수 있는 문제이지만 심도있게 원인과 분석 그리고 해결과 정리까지 개발자로서 배워야 될 트러블 슈팅 과정의 정수를 보는 느낌이였습니다.
실무를 하면서 직감적으로 해결만하고 정확한 원인 파악 및 해결 방안들을 열거하고 어떤 해결 방안이 좋은 해결 방안인지 도출하기를 귀찮아 미뤘던 경우가 많았었는데 해당 포스팅을 보면서 동기부여를 얻고 갑니다. 좋은 글 잘 읽었습니다 :)
데이터가 있었는데요, 아니 없어요 - 컬리 기술 블로그
http://thefarmersfront.github.io/blog/commit-mvcc-set-autocommit/