1

PHPでミューテックスを構築するためにMYSQLロックを使用しようとしています。

ユーザーごとに 1 つのプロセスがあり、各プロセスを一度に 1 つずつ実行したいと考えています。

ユーザー「my_user」の1つのプロセスが「my_user」の他のプロセスが存在することを確認した場合、新しいプロセスは別の方法をとります。たとえば、このユーザーのプロセスがすでに実行されていることを報告するコードの一部です。

このテスト コードを取得しましたが、GET_LOCK 関数が 2 番目のインスタンスで 1 秒以上待機していることがわかります。なぜですか?

//name of the lock
$user = "my_user";

//calling get_lock with 1 second as timeout
$i_sql = "SELECT GET_LOCK('$user', 1)";
if($debug) file_put_contents($logfile, "$i_sql \r\n", FILE_APPEND); 
$result = mysqli_query($con, $i_sql);
if (!$result) {
  echo "Could not successfully run query ($i_sql) from DB: " . mysql_error();
  exit;
}

echo "Adquired ".date('Y-m-d H:i:s')."<br>";

$row = mysqli_fetch_array($result);
print_r($row);
echo "<br>";
$count = 0;
//stay here 10 seconds
while($count < 2){
    sleep(5);
    $count++;
}

//release the lock  
$i_sql = "SELECT RELEASE_LOCK('$user')";
if($debug) file_put_contents($logfile, "$i_sql \r\n", FILE_APPEND); 
$result = mysqli_query($con, $i_sql);
if (!$result) {
  echo "Could not successfully run query ($i_sql) from DB: " . mysql_error();
  exit;
}
echo "Release ".date('Y-m-d H:i:s')."<br>";

mysqli_close($con);
unset($con);

出力:

10:00:07 に起動されたプロセス 1 :

Adquired 2013-07-08 10:00:08
Array ( [0] => 1 [GET_LOCK('my_user', 1)] => 1 )
Release 2013-07-08 10:00:18

10:00:08 に起動されたプロセス 2 :

Adquired 2013-07-08 10:00:18
Array ( [0] => 1 [GET_LOCK('my_user', 1)] => 1 )
Release 2013-07-08 10:00:28
4

0 に答える 0