PHP は、同時注文と引き抜きによって引き起こされるマイナス在庫の問題を解決します

WBOY
リリース: 2016-07-29 09:02:53
オリジナル
1381 人が閲覧しました

再掲アドレス: クリックするとリンクが開きます

データベース処理 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 番目のオプションで、おおよそのコードは次のとおりです: //ブロッキング (待機) モード

?

1 2<?php

3

4

5

6

7

8

9

<?php

$fp= fopen("lock.txt"$fp = "w+");

if(flock($fp,LOCK_EX))

{

    //..处理订单

    flock($fp,LOCK_UN);

}

fclose($fp);

//非阻塞模式

?

);

1

2

3

4

5

6

7

8

9

10

11

12

13

<?php

$fp= fopen("lock.txt"fopen"w+");

if(flock($fp( 「lock.txt」

{

    //..处理订单

    flock($fp,LOCK_UN);

}

else

{

    echo"系统繁忙,请稍后再试";

}

fclose($fp);

"w+"
if

(


flock

(

$fp🎜🎜,LOCK_EX))🎜🎜🎜🎜{🎜🎜 🎜 🎜🎜//..注文を処理する🎜🎜🎜🎜 🎜🎜flock🎜🎜(🎜🎜$fp🎜🎜,LOCK_UN);🎜🎜🎜🎜}🎜🎜🎜🎜fclose(🎜🎜$fp🎜🎜) ; 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜/ /ノンブロッキングモード🎜🎜🎜🎜🎜?🎜🎜🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8 🎜 9🎜🎜10🎜🎜11🎜 🎜 12🎜🎜13🎜🎜🎜🎜🎜🎜<?php🎜🎜🎜🎜$fp🎜🎜= 🎜🎜fopen🎜🎜(🎜🎜"lock.txt"🎜🎜, 🎜🎜"w+"🎜🎜);🎜🎜🎜🎜if🎜🎜(🎜🎜flock🎜🎜(🎜🎜$fp🎜🎜,LOCK_EX) | LOCK_NB))🎜🎜🎜🎜{🎜🎜🎜🎜 🎜🎜//..注文を処理中🎜🎜🎜🎜 UN);🎜🎜🎜🎜}🎜🎜🎜🎜その他🎜🎜🎜 🎜{🎜🎜🎜🎜 🎜🎜echo🎜🎜「システムがビジー状態です。後でもう一度お試しください。」🎜🎜;🎜🎜🎜🎜}🎜🎜🎜🎜fclose(🎜🎜$fp 🎜🎜);🎜🎜🎜 🎜🎜🎜 🎜🎜🎜🎜どれ使用する方法は同時実行数によって異なります。 🎜🎜 🎜 上記では、PHP が同時注文と抽選によるマイナス在庫の問題をどのように解決するかを、関連する側面も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。 🎜 🎜 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート