핵심 요약
여기어때가 유저 혜택 이벤트 처리의 데드락 문제를 DB 트랜잭션 설계와 락 관리로 크게 완화한 사례를 공유한다.
주요 경험
- 초기 FOR UPDATE로 직렬 처리하려다 데드락이 발생했다(중복은 ON DUPLICATE KEY UPDATE로 처리).
- INSERT IGNORE로 중복 무시했지만 S-Lock과 FOR UPDATE 충돌로 ABBA 패턴 데드락이 생겼다.
- 카운터 제거와 상태 변경 최소화로 구조를 바꾸고, 생성은 INSERT IGNORE, 상태 변경은 재소비 안전하게 분리했다. 락 순서는 rookie_reward → rookie_reward_step으로 통일했다.
얻은 인사이트
- 데드락의 주된 원인은 락 추가가 아니라 필요성/순서의 재설계에서 나온다.
- idempotent 설계로 재소비 안전성을 확보하는 것이 중요하다.


