은행 계좌만의 문제가 아님

같은 옛값을 읽고 각자 계산한 뒤 쓰면, 업무가 달라도 마지막 WRITE 하나만 남습니다.

갱신 분실의 변형은 모두 같은 구조를 가집니다. 공유 상태는 하나인데, 트랜잭션은 각자 오래된 값을 기준으로 계산해 먼저 반영된 변경을 지워 버립니다.

계좌 잔고

100만원에서 출금 두 건

T1: 100 → 90 T2: 100 → 80
70만원

두 출금이 모두 반영됨

80만원

T1이 만든 90만원 상태가 덮어써짐

출금 1건 소실
재고 수량

재고 10개에 주문 두 건

주문 A: 10 → 9 주문 B: 10 → 9
8개

두 주문이 모두 차감됨

9개

주문은 2건인데 차감은 1번만 남음

재고 1개 과다 표시
좌석 예약

빈 좌석 1개에 예약 두 건

사용자 A: 빈 좌석 → 예약 사용자 B: 빈 좌석 → 예약
1건만 성공

뒤늦은 요청은 실패해야 함

둘 다 성공 처리 가능

상태는 같아 보여도 예약 주체가 충돌함

중복 예약
조회수·좋아요

100에서 증가 요청 두 건

요청 A: 100 → 101 요청 B: 100 → 101
102

증가가 두 번 누적됨

101

이벤트는 2번인데 카운트는 1번만 반영

증가 1회 소실
문제의 본질

업무 종류가 달라져도 본질은 같습니다. 하나의 공유 상태를 여러 트랜잭션이 같은 시작값으로 읽고, 각자 계산한 뒤 다시 쓰면 최종 상태는 마지막 기록만 남습니다.

공유 상태 + stale read + overwrite