あなたの問題は、「同期ロックはどうあるべきか」という質問に要約されます。 。あなたの質問から、予約は特定のアイテムの予約ではないようです。ただし、ユーザーが特定のホテルの部屋を予約しているため、2つの問題を解決する必要があると仮定します。
- オーバーブッキングを防止します(たとえば、2人で同じものを予約する)
- 並行アカウント状態の誤算を防ぐ
したがって、ユーザーが確認を押しようとしている時点に到達したとき ボタンをクリックすると、これは実装可能なシナリオです:
-
トランザクションを開始する
-
並列プロセスがブロックされるようにユーザーエントリをロックします
SELECT * FROM user FOR UPDATE WHERE id = :id
-
アカウントの残高を再確認し、資金が不足している場合は例外/ロールバックをスローします
-
オーバーブッキングを防ぐために、予約するアイテムをロックします
SELECT * FROM room FOR UPDATE WHERE id = :id
-
予約の空き状況を再確認し、アイテムがすでに予約されている場合は例外/ロールバックをスローします
-
予約エントリを作成し、ユーザーのアカウントから資金を差し引きます
-
トランザクションをコミットします(すべてのロックが解放されます)
あなたの場合、オーバーブッキングをチェックする必要がない場合は、ステップ4と5をスキップ/無視してください。