再掲アドレス: クリックするとリンクが開きます
データベース処理 SQL は 1 つずつ処理されることがわかっています。商品を購入するプロセスは次のようになっているとします。
{/ /Generate order...
sql2: Inventory-1}
同時実行がない場合、上記のプロセスは非常に完璧に見えますが、2 人が同時に注文し、在庫が 1 つだけあるとします。 SQL1 ステージ、2 人のクエリ 在庫はすべて > 0 だったので、最終的に SQL2 が実行され、最終的に在庫は -1 になりました。在庫を補充するか、ユーザーの苦情を待つ必要があります。
この問題を解決するための一般的なアイデア:
1. 追加の単一プロセスを使用してキューを処理し、注文リクエストをキューに入れて 1 つずつ処理するため、同時実行の問題は発生しません。バックグラウンドプロセスが必要であり、遅延は考慮されません。
2. データベースのオプティミスティック ロック。大まかに言うと、最初に在庫をクエリし、すぐに在庫に 1 を追加し、注文が生成された後、在庫を更新する前に再度在庫をクエリして、予想される在庫と一致しているかどうかを確認します。数量が矛盾している場合はロールバックし、在庫が不十分であることをユーザーに通知します。
3. 更新結果に基づいて判断するには、sql2でinventory>0という判定条件を追加します。 falseが返された場合、在庫が不足していることを意味し、トランザクションはロールバックされます。
4. ファイル排他ロックを使用して、注文リクエストを処理するときに、flock を使用してファイルをロックします。その時点で、他の注文が処理中であることを意味します。ユーザー「サーバービジー」この記事 私が話しているのは 4 番目のオプションで、おおよそのコードは次のとおりです: //ブロッキング (待機) モード
?
3 4 5 6 7 8 9 | <?php
|
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
、
| );
(