0

MySQL でテーブルをロックするのに問題があります。異なるブラウザーで 2 つのスクリプトを同時に実行して、同時要求をテストしてみました。

スクリプト 1:

mysql_query("lock tables id_numbers write");

$sql = "select number from id_numbers";
$result = mysql_query($sql);

if ($record = mysql_fetch_array($result))
{
  $id = $record['number'];
}

sleep(30);

$id++;

$sql = "update id_numbers set number = '$id'";
$result = mysql_query($sql);

mysql_query("unlock tables");

スクリプト 2:

$sql = "select number from id_numbers";
$result = mysql_query($sql);

if ($record = mysql_fetch_array($result))
{
  $id = $record['number'];
}

echo $id;

最初にスクリプト 1 を開始し、次にスクリプト 2 を開始します。理論的には、スクリプト 2 は、スクリプト 1 がテーブルのロックを解除するまで 30 秒以上待機してから、更新された ID を出力する必要があります。ただし、すぐに元の ID が出力されるため、ロックは明らかに有効ではありません。何がうまくいかないのですか?

ところで、私はまだ mysql_* を使用すべきではないことを知っていますが、今のところそれで立ち往生しています。

編集:ライブ サイトではロックが発生するが、私の開発サイトでは発生しないことがわかりました。それらは両方とも共有ホスト上にあるため、2 つの間に異なる設定があると想定しています。それが何であるか考えていますか?

4

1 に答える 1

1

ここにあるコードを使用すると、期待どおりの動作が得られます。スクリプト2は、スクリプト1がを発行するまでブロックしますunlock tables

あなたの問題は他の場所にあるに違いありません。チェックすること:

  1. テーブルは実際にデータベースに存在しますか?(mysql_query()戻り値を確認し、戻りmysql_error()がある場合は使用してくださいFALSE。)
  2. 両方のスクリプトが同じデータベースに接続していますか?
  3. テーブルが一時的な(したがって接続ローカルの)テーブルではないことを確認しますか?
  4. スクリプト1のmysql接続(またはスクリプト自体)がの間にタイムアウトになりsleep(30)、予想よりも早くロックが解放される可能性がありますか?
于 2012-11-04T04:46:05.927 に答える