ホームページ バックエンド開発 PHPチュートリアル mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

Jul 06, 2016 pm 01:53 PM
mysql php thinkphp

注文の簡単な例 (コードがアップロードされ、トランザクションが追加されていない場合):

リーリー

デフォルトで 100 アイテムの在庫があります:
mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

ログテーブル:
mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

Apache ab ツール同時実行:
ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html

その結果、同時実行性の問題が発生します (非常に自然です):
mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

その後、トランザクション制御を追加した後:

リーリー

再度同時実行性をテストします:
ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
結果は、出力に問題はありません (実際には同時実行の問題は解決されましたか?):
mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

それを行うにはRedisキューを使用するという人がたくさんいますが、具体的な実装についてはまだわかりません。

返信内容:

注文の簡単な例 (コードがアップロードされ、トランザクションが追加されていない場合):

リーリー

デフォルトで 100 アイテムの在庫があります:


mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

ログテーブル:


mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

Apache ab ツール同時実行:

ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html

その結果、同時実行性の問題が発生します (非常に自然です):


mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

その後、トランザクション制御を追加した後:

リーリー

再度同時実行性をテストします:

ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
結果は、出力に問題はありません (実際には同時実行の問題は解決されましたか?):

mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

それを行うにはRedisキューを使用するという人がたくさんいますが、具体的な実装についてはまだわかりません。

トランザクションは同時実行性とは何の関係もありません。トランザクションを使用すると、このロジック部分の成功または失敗が保証されるだけで、同時実行中にプログラム ロジックを制御できることは保証されません。

同時実行性を制御するにはロックが依然として必要です。たとえば、mysql は前述のように楽観的ロックを実装します。

たとえば、upadte table set a = a - 1 where a = 5; a=5 の場合にのみ、この更新によりデータが実際に変更され、変更されるデータのバージョンが予想したものと異なることが確認されます。の場合、操作は実行されず、影響を受ける行の数を使用して変更があるかどうかが判断され、次の操作を続行するか終了します。

単一のマシンがロックをブロックする目的を達成するために flock を直接使用できる場合は、排他的ロックを使用することもできます。

または、ロックを実装するための Redis と memcache。

リクエストが多い場合は、ロック操作に redis と memcache を使用するか、同時実行性を処理するためにメッセージ キューの使用を検討することをお勧めします。

4000 の同時実行でテストしましたが、依然として問題が発生します:

mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?

PSがトランザクションを利用する場合は必ず行ってください

更新するには、A=X 制限 1 の表から * を選択してください;

;

务必使用FOR UPDATE更新に使用しない場合は、必ず負の数値が表示されます。

データテーブルをロックすることもできます (

エンジンはテーブルロックを使用します)

InnoDB引擎就用行锁;MyISAM

コアはまだデータベース内にあります。悲観的ロックまたは楽観的ロックを作成する必要があります。

表面的には問題は解決したように見えますが、実際には特殊な状況下では売られ過ぎが依然として発生する可能性があります。


トランザクションは均一に送信することで解決できますが、一般的にこの問題はロックすることで解決する必要があります。

ロックを使用しない場合は、キューに入れられた挿入であるキューを使用し、非同期を同期に変更する必要があります。これが最も安全な方法です。


私の回答を参照してください。

https://segmentfault.com/q/1010000005105041/a-1020000005106490

队列的方法可以是,一个商品库存(也可以所有商品一起,跑一个下单队列)在后台有一个脚本在跑,然后把请求变成串行。这个方案会被推崇是因为可控性,我们可以根据系统需要控制处理的频率。

缓存的做法是,定时将商品库存更新到缓存里面去,利用缓存的原子读写,对缓存里的库存进行自减操作,如果自减后大于零,就可以走后面的下单流程(下单流程仍然需要完整的事务加锁来保证一致性),缓存的目的在于,避免流量冲击,只有有效流量进入db。

把第一个例子中的$condition['id'] = 1;换成"id=1 and stock_left > 0"的等效条件就解决问题了,不需要事务,事务在这个时候起不到什么作用。后面的逻辑当然也要相应调整,因为setDec肯定成功,但是不一定真有记录被修改了,所以伪码示例:

<code>$sql = "update table set num = num - 1 where num > 0";
$updatedRows = get_updated_rows($db->exec($sql));
if ($updatedRows > 0) {
    //成功
} else {
    //失败
}</code>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

PHPの未来:適応と革新 PHPの未来:適応と革新 Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

PHPの現在のステータス:Web開発動向を見てください PHPの現在のステータス:Web開発動向を見てください Apr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

See all articles