피드로 돌아가기
컬리 기술블로그Database
원문 읽기
데이터가 있었는데요, 아니 없어요
Kurly 멤버십팀이 hikari.auto-commit: false 설정과 MVCC 스냅샷 갱신 메커니즘 이해로 간헐적 데이터 조회 실패를 해결하고 API 응답시간 1.5ms 단축
AI 요약
Context
hikari.auto-commit을 false로 설정하고 @Transactional 애노테이션이 부모 메서드에 없는 상황에서, 신규 회원 데이터가 INSERT되었음에도 불구하고 같은 세션의 다른 쿼리에서 데이터가 조회되지 않는 간헐적 에러가 발생했다. 재요청 시에는 데이터가 정상 조회되는 비일관적 동작으로 인해 원인 파악이 복잡했다.
Technical Solution
- 문제 원인 파악: autocommit이 false인 상태에서 COMMIT이 실행되지 않아, InnoDB MVCC의 Snapshot이 갱신되지 않음을 식별
- MVCC 스냅샷 동작 이해: REPEATABLE READ 격리수준에서 트랜잭션 시작 시점의 Snapshot을 유지하며, COMMIT/ROLLBACK/BEGIN 명령어만이 새로운 Snapshot을 생성함을 파악
- @Transactional 애노테이션 추가: outerMethod()에 @Transactional(readOnly = true)를 적용하여 메서드 종료 시점에 COMMIT이 자동 실행되도록 변경
- autocommit 설정 최적화: hikari.auto-commit을 false로 유지하되, @Transactional 설정이 올바르게 적용된 메서드에서 SET autocommit 쿼리 호출 횟수 감소
Impact
- API 응답시간 1.5ms 단축
- API 응답속도 40% 향상
Key Takeaway
autocommit: false 설정으로 인한 성능 개선 시 @Transactional 애노테이션 적용 여부를 반드시 검증해야 한다. MVCC 기반 데이터베이스에서는 Snapshot 갱신 메커니즘이 트랜잭션 경계와 직결되므로, 명시적 COMMIT 실행 보장이 데이터 일관성의 필수 조건이다.
실천 포인트
hikari.auto-commit을 false로 설정하여 성능을 개선하는 환경에서, 쿼리를 실행하는 모든 메서드에 @Transactional 애노테이션을 명시적으로 적용하면 MVCC 스냅샷이 메서드 경계마다 갱신되어 신규 데이터 조회 실패를 방지할 수 있다.