0

我无法让表锁定在 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_*,但我现在坚持使用它。

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

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 回答