본문으로 이동
데이터가 있었는데요, 아니 없어요
문서

데이터가 있었는데요, 아니 없어요

호선우 컬리 · 컬리 기술 블로그

원문 보기

AI 핵심 요약

회원 데이터가 Master DB에 저장되고 Slave DB에서도 조회되는데, Master의 다른 세션에서는 간헐적으로 보이지 않는 문제가 발생했다. 원인은 Replica Lag이 아니라 HikariCP의 auto-commit 비활성화, REPEATABLE READ의 MVCC 스냅샷, 그리고 OSIV와 하위 메서드의 트랜잭션 경계가 맞물려 기존 스냅샷이 유지된 것이었다. 팀은 격리 수준 변경이나 잠금 읽기의 부작용을 검토한 뒤, 바깥 조회 메서드에 @Transactional(readOnly = true)를 적용해 트랜잭션 종료 시 커밋으로 스냅샷을 갱신하도록 했다. 또한 auto-commit 비활성화로 트랜잭션 전후의 설정 쿼리를 줄여 응답 시간을 개선했으며, 이 설정을 사용할 때는 쿼리 메서드의 트랜잭션 적용과 커밋·롤백 로그를 확인해야 한다고 정리했다.

  • InnoDB의 REPEATABLE READ에서는 트랜잭션의 첫 일관 읽기 시점에 만들어진 스냅샷을 유지하므로, 다른 세션의 커밋만으로 기존 세션의 조회 결과가 최신화되지는 않는다.
  • HikariCP의 auto-commit을 false로 설정하면 트랜잭션 경계와 커밋·롤백 동작을 명시적으로 점검해야 하며, 커넥션 종료 시 미커밋 상태는 롤백될 수 있다.
  • Spring Data JPA에서 직접 정의한 쿼리 메서드는 기본 CRUD 메서드와 달리 자동으로 @Transactional이 적용되지 않을 수 있으므로 로그로 트랜잭션 적용 여부를 확인한다.
  • OSIV가 활성화되면 커넥션이 API 처리 동안 유지될 수 있어, 하위 메서드의 트랜잭션 설정이 스냅샷과 커넥션 동작에 미치는 영향을 함께 살펴야 한다.

소개

COMMIT, MVCC 그리고 SET AUTOCOMMIT

비슷한 학습 자료

문서 이창섭

AccessBlock, 그 시작과 진화의 여정

백엔드 데브옵스 · 인프라

문서 김동호

DB Connection과 Garbage Collector의 관계를 중심으로 mysql-connector-j 사용 시 발생할 수 있는 메모리 누수를 탐지하고 해결한 경험을 공유합니다.

백엔드 데이터베이스

문서 유형환

애플리케이션, DB 모두 행복한 BULK 처리

백엔드 데이터베이스

문서 서민우

카프카 스트림즈를 추가하다

백엔드 데이터베이스

문서 박제희, 이규원, 이종립

성능 테스트로 데드락을 찾아 없애고 TPS를 끌어올리자!

데이터베이스 프로덕트 지표 · 실험

문서 박제희

DB에 저장을 했는데, 조회가 안 돼요

백엔드 데이터베이스