mysql - PHP での同時実行性の高い注文はトランザクションを使用して解決できますか?
注文の簡単な例 (コードがアップロードされ、トランザクションが追加されていない場合):
リーリーデフォルトで 100 アイテムの在庫があります:
ログテーブル:
Apache ab ツール同時実行:
ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
その結果、同時実行性の問題が発生します (非常に自然です):
その後、トランザクション制御を追加した後:
リーリー再度同時実行性をテストします:
ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
結果は、出力に問題はありません (実際には同時実行の問題は解決されましたか?):
それを行うにはRedisキューを使用するという人がたくさんいますが、具体的な実装についてはまだわかりません。
返信内容:注文の簡単な例 (コードがアップロードされ、トランザクションが追加されていない場合):
リーリー
デフォルトで 100 アイテムの在庫があります:
ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
リーリー
再度同時実行性をテストします:ab -n 1200 -c 1200 -w http://localhost/queue/index.php >> D:/1.html
結果は、出力に問題はありません (実際には同時実行の問題は解決されましたか?):
同時実行性を制御するにはロックが依然として必要です。たとえば、mysql は前述のように楽観的ロックを実装します。
たとえば、upadte table set a = a - 1 where a = 5; a=5 の場合にのみ、この更新によりデータが実際に変更され、変更されるデータのバージョンが予想したものと異なることが確認されます。の場合、操作は実行されず、影響を受ける行の数を使用して変更があるかどうかが判断され、次の操作を続行するか終了します。
単一のマシンがロックをブロックする目的を達成するために flock を直接使用できる場合は、排他的ロックを使用することもできます。
リクエストが多い場合は、ロック操作に redis と memcache を使用するか、同時実行性を処理するためにメッセージ キューの使用を検討することをお勧めします。
更新するには、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>

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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