6장. 동시성 경쟁을 데이터베이스에서 재현한다
두 배정 요청을 동시에 보내 한 슬롯을 차지하게 한다. 애플리케이션의 if empty then update만으로는 경쟁을 막지 못한다. 조건부 update, unique constraint, 행 잠금, 적절한 격리 수준 중 가장 단순한 방어를 선택하고 실제 경쟁 테스트로 확인한다.
update visit_slot
set worker_id = :worker, status = 'confirmed'
where id = :slot and status = 'open';
-- affected rows가 1일 때만 성공
잠금을 선택하면 순서, 보유 시간, deadlock 재시도 정책을 기록한다. 격리 수준 이름만 높인다고 모든 불변식이 자동 보장되지 않는다. 읽기·쓰기 패턴과 데이터베이스 공식 문서를 기준으로 검증한다.