피드로 돌아가기
Dev.toDatabase
원문 읽기
MySQL SKIP LOCKED 도입으로 초과 판매 0건 및 p95 지연시간 83% 개선
We Replaced Redis with MySQL SKIP LOCKED for Inventory Reservation — Oversells Went to Zero
AI 요약
Context
Redis 카운터와 SQL 소유권 정보를 분리 운영하며 발생한 원자성 결여로 월 40~60건의 초과 판매 발생. Redlock 기반의 동기화 방식이 Redis 영역만 보호하며 데이터 불일치 문제를 해결하지 못한 구조적 한계 노출.
Technical Solution
- Row-per-unit 모델 도입을 통한 카운터 기반 구조에서 개별 유닛 관리 구조로 전환
- FOR UPDATE SKIP LOCKED 구문을 활용해 경합 행을 무시하고 가용한 행을 즉시 점유하는 Concurrent Work Queue 구현
- 데이터베이스 트랜잭션을 통해 점유, 홀드, 예약 프로세스를 단일 원자적 단위로 통합
- 쿼리 단계에서 hold_expires_at를 검사하는 Self-healing Expiry 로직으로 별도 스위퍼 없이 만료 데이터 회수
- READ COMMITTED 격리 수준 설정으로 Gap Lock 발생을 억제하여 데드락 발생률 70% 감소
- Unique Index를 최후 보루로 설정하여 애플리케이션 로직 오류 시에도 데이터 무결성 보장
실천 포인트
분산 락을 통한 다중 저장소 동기화보다 단일 진실 공급원(Single Source of Truth) 내에서 트랜잭션을 처리하는 것이 무결성 확보에 유리함