首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表锁失败

表锁失败
EN

Stack Overflow用户
提问于 2012-11-04 10:55:35
回答 1查看 108关注 0票数 0

我在获取表以锁定MySQL时遇到了问题。我曾尝试通过在不同的浏览器上同时运行两个脚本来测试并发请求。

脚本1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
$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_*,但我现在被它卡住了。

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-04 12:46:06

使用这里的代码,我得到了您所期望的行为:脚本2将阻塞,直到脚本1发出unlock tables

你的问题一定出在别的地方。要检查的事项:

  1. 该表是否确实存在于数据库中?(请检查您的mysql_query()返回值,如果得到任何FALSE返回,请使用mysql_error()。)
  2. 是两个连接到同一数据库的脚本吗?
  3. 您确定该表不是临时(连接本地)表吗?
  4. 可能会在<代码>D12期间脚本1的mysql连接(或脚本本身)超时,从而比您预期的更早释放锁?<代码>H213<代码>G214
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13215632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档