인프런 커뮤니티 질문&답변
[33. 좋아요 수 구현] 에서 테스트 하는 화면 동시성 문제
작성
·
6
0
학습 관련 질문을 최대한 상세히 남겨주세요!
고민 과정도 같이 나열해주셔도 좋습니다.
먼저 유사한 질문이 있었는지 검색해보세요.
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
[33. 좋아요 수 구현] 에서 테스트 하는 화면에서요.
해당 방법대로 실행을 하면 동시성 문제가 발생합니다.
Record has changed since last read in table 'article_like_count'
저는 MariaDB를 사용하고 있는데요.
MySQL도 마찬가지로 기본 잠금 수준이 Repeatable Read 라고 알고 있습니다.
해당 기본 수준으로 실행하면 동시성 문제로 영상과 다른 결과를 보이게 됩니다.
따라서 잠금 수준을 Read Commited 나 Read Uncommited 로 변경하면 제대로 실행이 됩니다.
이렇게 하는 것이 정답인지 아니면 다른 원인이 있는건지 알려주세요.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 주주파파님.
MariaDB를 사용하신다고 하셨고, 동시성 문제와 관련된 질문을 주셨네요. 기본적으로 MySQL과 MariaDB의 잠금 수준은 Repeatable Read로 설정되어 있어서 트랜잭션마다 데이터를 동일하게 읽을 수 있는 장점이 있지만, 이로 인해 동시성 문제가 발생할 수 있습니다. 말씀하신 대로, 이를 해결하기 위해 Read Committed로 격리 수준을 변경하는 것이 방법 중 하나입니다.
문제의 원인 및 해결 방법
잠금 수준 문제:
Repeatable Read수준에서는 트랜잭션이 시작되었을 때의 데이터를 보여주기 때문에, 동시성이 높은 환경에서 업데이트 및 읽기 오류가 발생할 수 있습니다. 이 경우Read Committed로 설정을 변경하면 커밋된 데이터만 읽기 때문에 동시성 문제를 저감할 수 있습니다.낙관적 락 활용: MariaDB에서 기본 설정으로 제공되는 락을 활용할 수도 있지만, 데이터베이스 수준에서 직접 관리하는 것이 아니라, 애플리케이션 수준에서 낙관적 락을 사용하여 충돌을 관리할 수 있습니다. JPA에서는
@Version어노테이션을 사용하여 낙관적 락을 구현할 수 있습니다.데이터 환경 특성 고려: MariaDB와 MySQL의 동작 특성이 미세하게 다를 수 있으므로, 테스트 환경에 맞게 데이터베이스 설정을 최적화하는 것이 중요합니다.
관련 자료 및 유사 글
비슷한 상황에서 발생할 수 있는 동시성 문제 해결 사례를 참고하시길 권장드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 제공하고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드리며, 추가적으로 궁금한 점이 있으시면 언제든지 문의주시기 바랍니다. 곧 지식공유자께서 추가적인 답변을 제공해 드릴 것입니다.





