ホームページ  >  記事  >  データベース  >  MySQLのロック機構とPHPのロック機構

MySQLのロック機構とPHPのロック機構

巴扎黑
巴扎黑オリジナル
2016-12-07 14:00:07823ブラウズ

シミュレーションの準備 -- スクリプトへの高い同時アクセスをシミュレートする方法: Apache インストール ファイルの bin/ab.exe で同時実行量をシミュレートできます -c - 同時実行数をシミュレートする量 -n 合計何回 http://リクエストはスクリプトに対して要求されます
例: cmd: apache install path/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php

【本題】
ロックMYSQL の場合:
構文:
LOCK TABLE テーブル名 1 READ |WRITE、テーブル名 2 READ|WRITE ................... [テーブルをロック]
UNLOCK TABLES [テーブルを解放]


Read : 読み取りロック|共有ロック: すべてのクライアントはこのテーブルの読み取りのみが可能ですが、このテーブルの書き込みはできません
書き込み: 書き込みロック|排他的ロック: 現在ロックされているすべてのクライアントはこのテーブルを操作でき、他のクライアントはブロックのみ可能です
注: 操作のみ実行できますテーブルのロック処理中 ロックされたテーブルを操作する場合は、操作対象のすべてのテーブルをロックする必要があります。

PHPのファイルロック(テーブルではなくファイルがロックされます)
ロックされたファイルとテーブルの間にはどのような関係がありますか? : まったく関係がありません。取得した人がそれを操作します。したがって、テーブルはまったくロックされていません。
テストするときは、ファイルが存在する限り、名前は関係ありません。

概要:
プロジェクト内の PHP ではファイル ロックのみを使用し、テーブル ロックを避けるようにしてください。がロックされている場合、このテーブルに関連する Web サイト全体のすべてがすべての機能が遅くなります (例: フロントデスクの多くのユーザーが注文しており、製品テーブルの mysql がテーブルをロックし、製品テーブルに関連するその他の操作) 1 つの機能が Web サイト全体の速度を低下させるため、ブロックされています [製品テーブルを読み取ることができません]。

私のプロジェクトの 1 つは O2O テイクアウトです。午後 12 時から午後 2 時までと午後 6 時は注文の同時実行性が高い時間帯です。この場合、MySQL ロックは明らかに考慮されておらず、ユーザー エクスペリエンスは非常に劣っています。実際、実際のニーズに応じて、持ち帰り用の在庫を設計する必要はありません。もちろん、フラッシュ セール アクティビティ モジュールに加えて、PHP ファイル ロックも必要です。

アプリケーションシナリオ:
1. 高い同時実行性で注文する場合、在庫を減らすときにロックが必要です
2. 高い同時実行性で注文してチケットを取得する場合、

MySQL ロックのサンプルコードを使用します:

Php コード

/**

フラッシュセールイベントのシミュレーション - 100 個の商品

CREATE TABLE a

(

id int comment '100 個のイベントアイテムの数量をシミュレーション'

);

INSERT INTO a VALUES(100);食べた: このスクリプトには 10 個の同時実行でアクセスしてください。 Apache に付属の ab.exe ソフトウェアを使用します

*/

mysql_connect('localhost','root','admin123');

#mysql Lock

mysql_query('LOCK TABLE a WRITE'); // 1 つのクライアントのみがテーブルをロックでき、他のクライアントはここでブロックされます

$rs = mysql_query('SELECT id FROM a'); $rs, 0, 0);

if($id > 0)

--$id;

mysql_query('UPDATE a SET id='.$id);

# mysql ロック解除

mysql_query('UNLOCK TABLES');

PHP ファイルロックのサンプルコード:

Php コード

/**

フラッシュセールイベントのシミュレーション - 100 個の商品

CREATE TABLE a

(

id int comment '100 個のイベントアイテムの数量をシミュレート'

);

INSERT INTO a VALUES(100);模倣: 10 の同時実行でこのスクリプトにアクセスしてください。 Apache に付属の ab.exe ソフトウェアを使用します

*/

error _reporting(0) ;

mysql_connect('localhost','root','admin123');

mysql_select_db('test');

# PHP でのファイルロック

$fp = fopen('./a.lock', ' r'); // PHP のファイル ロックはテーブルとは関係がなく、任意のファイルのみです

flock($fp, LOCK_EX) // 排他的ロック

$rs = mysql_query('SELECT id FROM a ');

$id = mysql_result($rs, 0, 0);

if($id > 0)

--$id;

mysql_query('SET ID =' $id);

}

#php ファイルロック、ロック解除

fclose($fp);
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。