同時予約テスト(超過予約が起きないことの実証)
「5泊分・各夜2室だけ」のダミー施設に、期間がバラバラに重なる予約を一斉に送ります。1泊でも満室の日を含む予約は、データベースが丸ごと拒否します。実際のサーバーとデータベースに向けて送信しています。
現在の在庫(各夜 2室)
■ 予約済みの室数(色付き=埋まっている室)
同時に予約するお客様の数
各リクエストは1〜3泊の期間をランダムに選び、同じ瞬間に送信されます。
結果
リクエストの応答ログ(到着順)
仕組み(技術メモ)
- 在庫は「客室タイプ × 宿泊日」ごとに持ち、CHECK (予約済み室数 ≦ 客室数) をデータベースに設定しています。満室の日に1件足そうとすると、DB自身がエラーにします。
- 予約の登録と、泊数分の在庫の加算はひとつのトランザクションです。3泊のうち1泊でも満室なら、全体が取り消されます(「1泊目だけ確保できた」状態は起きません)。
- 本番(PostgreSQL)では同じ考え方を CHECK制約・行ロック(SELECT … FOR UPDATE)・排他制約(EXCLUDE USING gist)で実装します。