为什么 LOCK TABLES [table] WRITE 不阻止表读取?

Ben*_*ess 6 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
}
Run Code Online (Sandbox Code Playgroud)

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

问题是,即使 script.php?l=1 有写锁,script.php 也会立即加载。如果我尝试在 script.php 中插入,它会等待,但为什么允许 SELECT?

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

Ben*_*ess 5

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

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

SELECT SQL_NO_CACHE * FROM mytable
Run Code Online (Sandbox Code Playgroud)