한정 수량 판매 음수 재고 문제 — 비관적 락 → 낙관적 락 전환 비교로 설명
사이드 프로젝트에서 한정 수량 판매 기능을 만들 때 동시성 문제를 처음 직접 겪었습니다. 동시에 여러 요청이 들어오면 재고가 음수가 되는 케이스가 테스트에서 재현됐고, 비관적 락(SELECT FOR UPDATE)으로 먼저 막았습니다. 트래픽이 낮을 때는 잘 동작했지만, 부하 테스트에서 락 경합으로 응답이 지연되는 문제가 생겼습니다. 낙관적 락으로 전환해 version 컬럼을 추가하고 충돌 시 재시도하는 방식으로 바꿨더니 처리량이 눈에 띄게 개선됐습니다. 다만 충돌이 잦은 상황에서는 재시도 비용이 비관적 락보다 높아질 수 있다는 걸 수치로 확인했고, 두 방식의 적합한 상황이 다르다는 걸 알았습니다.
동시성 전략은 요청 충돌 빈도를 먼저 따져야 한다는 원칙이 그때 생겼습니다.