작성
·
156
0
안녕하세요. 자바 ORM 표준 JPA 프로그래밍 책으로 학습 중에 "1차 캐시를 통해 Repeatable Read 수준의 트랜잭션 격리 수준을 제공한다"는 내용을 보고 궁금증이 생겨 질문 남깁니다.
격리 수준이 Read-Committed와 Repeatable Read인 경우, 언두 로그를 이용한 MVCC로 한 트랜잭션 내에서 반복적인 읽기를 보장한다고 알고 있습니다.
하지만 이 둘을 성능 관점에서 봤을 때 언두 로그에 있는 Row를 삭제하는 범위가 달라져 상대적으로 Repetalbe Read가 성능이 더 안 좋다고도 알고 있습니다.
결과적으로 1차 캐시를 통해 애플리케이션 레벨에서 Read Committed를 보장해 주는데, 굳이 MySQL 서버에서는 불필요하게 언두 로그에 더 많은 Row를 저장하면서까지 Repetable Read를 설정할 필요가 없다고 생각이 됐습니다.
따라서 MySQL 8.0 기준으로 JPA를 사용하면, 트랜잭션 격리 수준을 Repetable Read로 설정하지 않아도 되나요?
답변 2
0
안녕하세요. 도기님
JPA를 사용하면 애플리케이션에서 같은 엔티티의 반복 읽기를 지원합니다.
따라서 데이터베이스는 Read-Commit으로 설정하는 것을 권장합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
도기님의 질문과 관련하여, 1차 캐시와 트랜잭션 격리 수준에 대해 궁금증을 가지신 것으로 보입니다. 특히, 애플리케이션 레벨에서 Repeatable Read 격리 수준을 제공하는 1차 캐시의 역할과 실제 데이터베이스에서의 트랜잭션 격리 수준 설정에 따른 성능상의 고민이 중심이 되는 것 같습니다.
JPA에서 1차 캐시를 통해 Repeatable Read 격리 수준을 제공한다는 점과 관련해서, JPA의 1차 캐시는 영속성 컨텍스트 내에서 조회된 엔티티의 복사본을 보관합니다. 이를 통해 같은 트랜잭션 내에서는 반복적인 조회 시 데이터베이스가 아닌 1차 캐시에서 데이터를 조회하여 Repeatable Read 격리 수준의 트랜잭션 격리 수준을 애플리케이션 차원에서 제공합니다.
관련하여 유사한 질문에 대한 지식공유자의 답변을 참고하시면 도움이 될 것 같습니다:
1차 캐시와 트랜잭션 격리 수준에 대한 질문 & 답변에서, 1차 캐시를 통한 Repeatable Read 수준의 트랜잭션 격리 수준을 제공하는 방식에 대한 설명과 트랜잭션 격리 수준과 성능 사이의 관계에 대해 설명합니다.
JPA 질문입니다.에서는 Read Committed 격리 수준과 JPA 1차 캐시의 사용 및 JPA 락의 필요성에 대해 논의합니다.
트랜잭션 격리수준에 대한 질문 & 답변에서는, 어떻게 JPA가 내부적으로 Repeatable Read를 보장하는지에 대한 설명을 볼 수 있습니다.
위 링크들은 JPA를 사용할 때 1차 캐시가 어떻게 동작하여 애플리케이션 레벨에서 격리 수준을 제공하는지, 그리고 동시성과 격리 수준 사이의 성능 trade-off에 대해 이해하는 데 도움을 줄 것입니다.
MySQL 8.0에서 트랜잭션 격리 수준을 Repeatable Read로 설정하지 않아도 되는지에 대한 질문에 대해서는, JPA를 사용할 때 애플리케이션 레벨에서 제공하는 격리 수준과 실제 데이터베이스의 격리 수준 설정 사이의 trade-off와 성능 측면을 고려해야 한다는 점을 유념해야 합니다. 이와 관련된 실제 데이터베이스 설정은 애플리케이션의 요구사항, 동시성 수준, 데이터 무결성 요구사항을 포함한 다양한 요소를 고려하여 결정하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.