根据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。事实上,我可能会进行交易,我现在正在调查,现在我只是想了解上述原因无效。
答案 0 :(得分:3)
这是因为查询缓存。有一个缓存结果可用,不会“影响”锁定,因此会返回结果。
可以通过在select:
中添加“SQL_NO_CACHE”关键字来避免这种情况SELECT SQL_NO_CACHE * FROM mytable
答案 1 :(得分:0)
LOCK
的要点是,在您的特定会话期间使用它时,其他会话不会修改该表。
您能够执行SELECT
查询的原因是,即使您打开一个新窗口,它仍然被视为同一MySQL
会话的一部分。