データベース処理 SQL は 1 つずつ処理されることがわかり、商品を購入するプロセスは次のようになるとします。
sql1: 製品在庫のクエリリーリー
この問題を解決するためのより一般的なアイデア:
1. 追加の単一プロセスを使用してキューを処理し、注文リクエストをキューに入れて 1 つずつ処理するため、同時実行の問題は発生しません。ただし、追加のバックグラウンド プロセスと遅延の問題は考慮されません。
2. データベースのオプティミスティック ロック。大まかに言うと、最初に在庫をクエリし、すぐに在庫に 1 を追加し、注文が生成された後、在庫を更新する前に再度在庫をクエリして、予想される在庫数量と一致しているかどうかを確認します。矛盾している場合は、Scroll を返し、在庫が不足していることをユーザーに通知します。
3. 更新結果に基づいて判定する場合は、判定条件更新を追加します... SQL2でinventory > 0が返される場合、在庫が不足していることを意味し、トランザクションはロールバックされます。
4. ファイル排他ロックを使用して、注文リクエストを処理するときに、flock を使用してファイルをロックします。その時点で、他の注文が処理中であることを意味します。ユーザー「サーバーがビジーです」
この記事では 4 番目の解決策について説明します。おおよそのコードは次のとおりです。
ブロック(待機)モード
リーリー
リーリー
http://www.bkjia.com/PHPjc/825404.html