表锁失败

时间:2012-11-04 02:55:35

标签: php mysql

我无法在MySQL中锁定表格。我已经尝试通过在不同的浏览器上同时运行两个脚本来测试并发请求。

脚本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应等待30秒以上,直到脚本1解锁表,然后输出更新的ID。但它立即输出原始ID,因此锁定显然没有生效。可能出现什么问题?

顺便说一句,我知道我不应该继续使用mysql_ *,但我现在仍然坚持使用它。

编辑:我发现锁定确实发生在实际网站上,但不在我的开发网站上。它们都在共享主机上,所以我假设有一些设置在两者之间有所不同。知道那可能是什么吗?

1 个答案:

答案 0 :(得分:1)

使用您在此处获得的代码,我得到您期望的行为:脚本2将阻止,直到脚本1发出unlock tables

你的问题必须在别的地方。要检查的事项:

  1. 表格确实存在于数据库中吗? (检查mysql_query()返回值,如果有任何mysql_error()返回,请使用FALSE。)
  2. 这两个脚本是否都连接到相同的数据库?
  3. 您确定该表不是临时(因此是连接本地)表吗?
  4. 脚本1的mysql连接(或脚本本身)是否可以在sleep(30)期间超时,从而比您预期的更早释放锁?