この記事の例では、PHP 開発における同時実行の問題を解決するためのいくつかの実装方法について説明し、参考のために皆さんと共有します。
製品ラッシュなどの同時実行シナリオでは、過剰販売が発生する可能性があります。現時点では、PHP 言語にはネイティブの同時実行ソリューションがないため、他の方法を使用して解決する必要があります。同時実行制御を実現します。
オプション 1: ファイル ロック排他ロックを使用する
ファイル ロックを取得するには、1 つのスレッドのみがこのロックを取得できます。ブロックするか、ロックを取得します。失敗
ロックを取得するときは、まず在庫をクエリし、在庫が 0 より大きい場合は注文し、在庫を減らしてからロックを解放します
オプション 2: Mysql データベースによって提供される悲観的ロックを使用します
Innodb ストレージ エンジンは行レベルのロックをサポートしており、データの行がロックされている場合、他のプロセスは最初にその行をクエリしてロックすることができません。
オプション 3: キューを使用する
注文リクエストは順番にキューに保存され、別のプロセスがバックグラウンドで使用されてキュー内の注文リクエストを処理します オプション 4: Redis を使用するRedis操作はすべてアトミックであり、商品の在庫は redis に保存できます。注文する前に在庫に対して decr 操作を実行します。戻り値が 0 以上の場合は注文できますが、それ以外の場合は注文できません。この方法の方が効率的です
その他の同時実行の問題:
実際のアプリケーションでは、多くの場合、キャッシュが失敗すると、データがフェッチされます。この時点で同時実行性が大きい場合、多くのプロセスが同時にデータベースにアクセスし、多くのリクエストがデータベースに侵入し、データベースがクラッシュします。ファイルロックを使用して解決できます
select stock_num from table where id=1 for update if(stock_num > 0){ //下订单 update table set stock_num=stock-1 where id=1 }
率直に言えば、ロックは同時実行の問題を解決するために必要です
関連書籍:
MySQL Redis の学習とアプリケーション
Redisにトランザクション機構と楽観的ロックを実装する方法
MySQLデータベースの最適化(3) - MySQLの悲観的ロックと楽観的ロック(同時実行制御)
以上がPHP 開発における同時実行の問題を解決するためのいくつかの実装方法の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。