为什么没有LOCK TABLES [table] WRITE会阻止表读取?

时间:2013-09-02 17:22:17

标签: php mysql locking table-locking

根据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。事实上,我可能会进行交易,我现在正在调查,现在我只是想了解上述原因无效。

2 个答案:

答案 0 :(得分:3)

这是因为查询缓存。有一个缓存结果可用,不会“影响”锁定,因此会返回结果。

可以通过在select:

中添加“SQL_NO_CACHE”关键字来避免这种情况
SELECT SQL_NO_CACHE * FROM mytable

答案 1 :(得分:0)

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

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