현재 상태를 조건에 포함해 중복 차감과 초과 판매를 막습니다.
동시에 여러 요청이 재고를 읽고 각각 계산한 값을 저장하면 마지막 쓰기가 앞선 변경을 덮을 수 있습니다. 읽기와 쓰기를 나누지 않고 stock 조건을 포함한 UPDATE 한 문장으로 원자적으로 변경합니다.
UPDATE 뒤 changes()가 1이면 차감 성공, 0이면 재고 부족이나 이미 처리된 상태로 판단할 수 있습니다.
실제 다중 연결에서는 짧은 트랜잭션, 일정한 잠금 순서, deadlock 재시도와 제품별 격리 수준을 함께 설계합니다.
동시 쓰기를 막는 락 방식이 근본적으로 다릅니다 — SQLite는 파일 전체 단위로 잠그지만 MariaDB·PostgreSQL은 행 단위로 잠가 동시성 처리량이 크게 차이 납니다.
먼저 SELECT한 stock 값을 애플리케이션에서 빼고 다시 저장하면 두 요청이 같은 재고를 판매할 수 있습니다.
직접 바꿔보세요재고를 3으로 바꾸고 네 번 차감해 성공·실패 기록을 확인하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.