sql >> データベース >  >> RDS >> PostgreSQL

INSERTを使用した並行性シナリオ

    あなたの問題は、「同期ロックはどうあるべきか」という質問に要約されます。 。あなたの質問から、予約は特定のアイテムの予約ではないようです。ただし、ユーザーが特定のホテルの部屋を予約しているため、2つの問題を解決する必要があると仮定します。

    • オーバーブッキングを防止します(たとえば、2人で同じものを予約する)
    • 並行アカウント状態の誤算を防ぐ

    したがって、ユーザーが確認を押しようとしている時点に到達したとき ボタンをクリックすると、これは実装可能なシナリオです:

    1. トランザクションを開始する

    2. 並列プロセスがブロックされるようにユーザーエントリをロックします

      SELECT * FROM user FOR UPDATE WHERE id = :id

    3. アカウントの残高を再確認し、資金が不足している場合は例外/ロールバックをスローします

    4. オーバーブッキングを防ぐために、予約するアイテムをロックします

      SELECT * FROM room FOR UPDATE WHERE id = :id

    5. 予約の空き状況を再確認し、アイテムがすでに予約されている場合は例外/ロールバックをスローします

    6. 予約エントリを作成し、ユーザーのアカウントから資金を差し引きます

    7. トランザクションをコミットします(すべてのロックが解放されます)

    あなたの場合、オーバーブッキングをチェックする必要がない場合は、ステップ4と5をスキップ/無視してください。



    1. オープンクエリ関数を使用して、SQLサーバーからOracleストアドプロシージャを実行しました

    2. Microsoft SQLのMySQLロングテキストアナログ?

    3. 行の賢明な合計を計算する-SQLサーバー

    4. Spring Boot + docker-compose + MySQL:接続が拒否されました