3

根据http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html,如果我锁定一个表以在 mysql 中写入,在解锁之前没有其他人可以访问。我写了这个脚本,加载为 script.php 或 script.php?l=1 取决于你想要做什么:

if ($_GET['l'])
{
    mysqli_query("LOCK TABLES mytable WRITE");
    sleep(10);
    mysqli_query("UNLOCK TABLES");
}
else
{
    $res=mysqli_query("SELECT * FROM mytable");
    // Print Result
}

如果我在一个浏览器窗口中加载 script.php?l=1 那么,当它处于睡眠状态时,我应该能够在另一个窗口中加载 script.php 并且它应该等到 script.php?l=1 完成,对吗?

事情是,script.php 会立即加载,即使 script.php?l=1 有一个写锁。如果我尝试插入 script.php 那么它会等待,但为什么允许 SELECT 呢?

注意:我不是在寻找关于是否使用 LOCK TABLES 的讨论。事实上,我可能会进行交易,我现在正在调查,现在我只想了解为什么上述方法不起作用。

4

2 回答 2

4

发生这种情况是因为查询缓存。有一个不“影响”锁的可用缓存结果,因此返回结果。

这可以通过在选择中添加“SQL_NO_CACHE”关键字来避免:

SELECT SQL_NO_CACHE * FROM mytable
于 2013-09-02T18:33:41.690 回答
0

的重点LOCK是,当您在特定会话期间使用该表时,其他会话不会修改该表。

您能够执行查询的原因是,即使您打开一个新窗口,SELECT它仍被视为同一会话的一部分。MySQL

于 2013-09-02T17:25:25.847 回答