dポイントプレゼントキャンペーン実施中!

PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。
Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。

単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか?
PHPから実施できるやり方をご教授頂けると幸いです。

-------Test Program()---------
<?php
$link = mysql_connect('localhost', 'login_id', 'login_pass');
mysql_select_db('db_name');

mysql_query('LOCK TABLES table1 WRITE');
mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"');

//$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。
$result = mysql_query('show processlist');

while ($row = mysql_fetch_assoc($result)){
printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"],
$row["Command"], $row["Time"] , $row["State"], $row["Info"]);
}
mysql_free_result($result);
mysql_query('UNLOCK TABLES');
?>

A 回答 (1件)

ロックを掛けた接続内では、ブロックされないので、ロック状況の取得は出来ないようです。


テスト状況を作るには、2つ以上の接続を作って、一つは、ロックしたままとする必要があるので、コマンドラインクライアントと、xampp(apache)などのhttpサーバー経由しphpでmysql接続とを駆使して、以下のようにしてみると、どのようにロックが行われているかを見ることが出来ます。
[1]. コマンドラインクライアントから、ロックする
> lock tables `xx_tbl` write;

[2]. phpで、上記ロックしたtableにアクセスするphpプログラム実行
select * from `xx_tbl`
  しかし、writeロックがかかってるので、待機状態になり、結果は返ってこない
  とりあえず、このウィンドウはこのままおいて

[3]. ブラウザの別ウィンドウまたは別のタブから、以下を発行するphpプログラム実行
show processlist;
 → 3スレッドが返ってくる
i: コマンドラインクライアントのスレッド、接続のままさわってなければ、sleep
ii: ロックテーブルにアクセス待機中スレッド、Stateカラム に waiting という記述、Infoカラムに、待機中クエリの内容
  ブロックされたクエリが表示されるだけなので、from 句からロック中のテーブルを推測するしかできない。
iii: show processlist; を発行したスレッド。Infoカラムにそのクエリ

[4]. コマンドラインクライアント で、ロック解除
> unlock tables;
 [2] のウィンドウをそのまま開いていれば、待機終了して、データ取得した結果が表示される。
ということで、ロック中のテーブルへさらに他からアクセスしている時しか、それを関知することはできないようです。
    • good
    • 0
この回答へのお礼

なるほど、ブロックしないと情報は取得できないのですね。
ありがとうございました。勉強になりました。

お礼日時:2014/07/23 20:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!