設計思想

ZeroBookの原子的トランザクション設計

2025-12-23

なぜ原子的トランザクションが必要か

予約システムにおいて最も避けなければならないのがダブルブッキングです。

同じ時間帯に2つの予約が入ってしまうと、お客様に「既に予約済みです」と謝罪する事態になります。

実装のポイント

1. FOR UPDATE ロック

SELECT * FROM bookings
WHERE form_id = $1 AND date = $2 AND start_time = $3
FOR UPDATE;

このクエリにより、同時に2つのリクエストが同じ枠を予約しようとしても、片方は待機させられます。

2. RPC関数での一括処理

予約の存在確認・空き枠チェック・INSERTを1トランザクション内で実行することで、アプリケーション層の不整合を排除しています。

結果

この設計により、予約が重複することが物理的に不可能になりました。