枠・在庫の引当設計|「仮押さえ」「確定」「解放」で二重予約を防ぐ方法

予約システムは「空き表示」ができても、二重予約が起きると現場が壊れます。
原因は、ユーザーが入力中の“仮押さえ”や、決済待ち、承認待ちなどで枠が揺れるためです。
この記事では、枠・在庫(部屋、車両、ピット、スタッフ、備品など)を安全に扱うために、引当(予約)をどう設計するかを整理します。

この記事で扱う論点
・仮押さえ(Hold)と確定の分離(入力中の競合を潰す)
・タイムアウト解放(放置で枠が死なない)
・キャンセル/変更との連動(状態がブレない)
・性能(空き表示とキャッシュ)と整合性の両立

1. 空き状況表示と“実際の引当”は別物

空き状況表示(空き表示パターン)は、あくまで「見せ方」です。
実際に枠を確保する仕組みが無いと、同時操作で二重予約が起きます。
そのため、設計上は次の3段階を分けます。

2. 仮押さえ(Hold)の基本:短時間・自動解放

仮押さえは長くすると他ユーザーの機会損失になり、短すぎると入力が間に合いません。
現実解は「◯分(例:10〜20分)で自動解放+延長は条件付き」です。

放置対策は“通知より先に解放”
通知(リマインド)で戻すのも手ですが、まず解放できる構造にしないと枠が死にます。

3. どの資源を引き当てるか:時間枠×資源の掛け算で考える

引当対象は「時間」だけではありません。業種により資源が違います。

時間枠設計(枠の実務)と資源設計を合わせないと、枠はあっても運用が回りません。

4. キャンセル/変更との連動:解放のタイミングを仕様にする

キャンセルや変更(キャンセル設計)が入ると、枠の解放が複雑になります。
ポイントは「いつ解放するか」を仕様として決めることです。

状態遷移は 遷移図 で整理し、例外処理を減らします。

5. 性能と整合:空き表示は速く、確定は正しく

空き表示は、アクセスが多いと重くなりがちです。
ただし、確定処理は“正しさ”が最優先です。
そのため、よくある方針は次の分離です。

確定が二重実行される事故(連打、戻るボタン等)への耐性は、冪等性(二重実行防止)の考え方が効きます。

業種別の典型

ホテル(部屋タイプ・プラン・団体)

部屋タイプやプランが絡むと「在庫」が複雑になります。
業務像は ホテル向け を前提に、
宿泊予約(部屋タイプ設計)や団体見積(MICE条件)は、仮押さえ→確定の段階を分けないと混乱しやすいです。

物流(バース予約・受付枠)

バース予約は“枠”を扱う典型です。
業務像は 物流向け を前提に、
バース予約(待機料を増やさない)では、仮押さえが長いと現場が詰まります。解放と確定のタイミングが重要です。

自動車販売・整備・タイヤショップ(ピット・作業枠・代車)

ピットや代車は“資源”であり、時間枠だけでは管理できません。
業務像は 自動車販売・整備・タイヤショップ向け を前提に、
入庫(前提回収)やピット割当(詰まらせない)と引当の粒度を揃えると、二重予約や現場の段取りミスが減ります。

インテンスでも、予約系は“空き表示”より“引当と解放”を先に固め、二重予約が起きない設計を優先します。

まとめ

枠・在庫の設計は、仮押さえ(Hold)と確定を分けるところから始まります。
タイムアウト解放、キャンセル/変更との連動、確定処理の競合対策(冪等性)を揃えると、二重予約の事故が現実的に減ります。
表示は速く、確定は正しく。この分離が運用の安定に効きます。

本記事は、Webシステム開発・スマホ自動変換「movo」・業務システム構築・フォームUX改善・EC支援を提供する 株式会社インテンスが、実際の開発プロジェクトで蓄積した知見をもとにまとめています。 株式会社インテンス(公式サイト)