ホームページ  >  記事  >  バックエンド開発  >  PHP は、フラッシュセールや宝くじなどの大規模なトラフィックの同時倉庫保管によって引き起こされるマイナス在庫の問題を解決します_PHP チュートリアル

PHP は、フラッシュセールや宝くじなどの大規模なトラフィックの同時倉庫保管によって引き起こされるマイナス在庫の問題を解決します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:24:32835ブラウズ

データベース処理 SQL は 1 つずつ処理されることがわかり、商品を購入するプロセスは次のようになるとします。

sql1: 製品在庫のクエリ

リーリー
同時実行性がない場合、上記のプロセスは非常に完璧に見えます。2 人が同時に注文し、SQL1 ステージでは在庫が 1 つだけあると仮定します。つまり、両方の人がクエリした在庫は 0 です。両方とも最終的に実行され、sql2 では最終的に在庫が -1 になりました。これは、在庫を補充するか、ユーザーの苦情を待つことを意味します。

この問題を解決するためのより一般的なアイデア:

1. 追加の単一プロセスを使用してキューを処理し、注文リクエストをキューに入れて 1 つずつ処理するため、同時実行の問題は発生しません。ただし、追加のバックグラウンド プロセスと遅延の問題は考慮されません。

2. データベースのオプティミスティック ロック。大まかに言うと、最初に在庫をクエリし、すぐに在庫に 1 を追加し、注文が生成された後、在庫を更新する前に再度在庫をクエリして、予想される在庫数量と一致しているかどうかを確認します。矛盾している場合は、Scroll を返し、在庫が不足していることをユーザーに通知します。

3. 更新結果に基づいて判定する場合は、判定条件更新を追加します... SQL2でinventory > 0が返される場合、在庫が不足していることを意味し、トランザクションはロールバックされます。

4. ファイル排他ロックを使用して、注文リクエストを処理するときに、flock を使用してファイルをロックします。その時点で、他の注文が処理中であることを意味します。ユーザー「サーバーがビジーです」

この記事では 4 番目の解決策について説明します。おおよそのコードは次のとおりです。

ブロック(待機)モード

リーリー

ノンブロッキングモード

リーリー

http://www.bkjia.com/PHPjc/825404.html

tru​​ehttp://www.bkjia.com/PHPjc/825404.html技術記事データベースが SQL を 1 つずつ処理していることがわかります。商品を購入するプロセスは次のようになるとします。 sql1: 商品の在庫を問い合わせる if (在庫数量 0) { //Generate order... sql2: Inventory-1}いや...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。