Lost Update Variants

갱신 분실은 덮어쓰기뿐 아니라 오래된 판단에서도 생긴다

공통점은 “읽은 순간의 전제”가 쓰는 순간에도 유효한지 확인하지 않는다는 점이다.

절대값 덮어쓰기

100을 읽고 계산한 80을 나중에 저장해 중간 변경 90을 덮는다.

오래된 검증

읽을 때는 재고가 충분했지만 쓰기 전 다른 주문이 재고를 줄였다.

중복 승인

같은 쿠폰/좌석/포인트를 둘 다 사용 가능하다고 판단한다.

증상

마지막 쓰기만 남거나, 영향받은 행 수를 확인하지 않아 실패를 성공처럼 처리한다.

감지

version, updated_at, 조건부 WHERE로 읽은 전제가 아직 맞는지 검사한다.

예방

가능하면 `balance = balance - :amount` 같은 원자적 UPDATE를 우선한다.

핵심: 읽은 값으로 새 절대값을 만들었다면, 쓸 때도 그 값이 아직 최신인지 검증해야 한다.