锁定 MyISAM 表 (MySQL) 和 PHP

Lock at MyISAM Table (MySQL) and PHP

提问人:StrongLucky 提问时间:9/5/2014 更新时间:10/9/2015 访问量:315

问:

MySQL中的表是MyISAM。

现在我想选择许多数据。

$res = $db->query("SELECT ...");
// -- Break 1
while($row = $res->fetch_assoc()) {
 //working with the row;
}
// -- Break 2

桌子上的锁什么时候结束?在休息 1 还是休息 2?

php mysql mysqli 锁定 myisam

评论

2赞 Jay Blanchard 9/5/2014
这是一本关于表锁定的好而深入的读物:dev.mysql.com/doc/refman/5.1/en/internal-locking.html
0赞 Santa's helper 9/5/2014
也许分析SQL可以提供有关mysql何时释放表的一些想法。
1赞 Santa's helper 9/5/2014
也许分析SQL可以提供有关mysql何时释放表的一些想法。细节我认为它在 Break1 中解析了您的查询并执行并返回了结果集资源,根据 Mysql 您的结果集已设置,因此同时插入或更新 sould 不会更改您的结果集
0赞 Jay Blanchard 9/5/2014
请@sectus解释您的意见。
0赞 Jay Blanchard 9/5/2014
我同意@Santa的助手,当查询根据我到目前为止阅读的内容返回结果时,应该释放锁。

答:

0赞 Haisum Usman 9/10/2014 #1

@bauer据我所知,你的问题。我附近的答案是,每当您使用 while 循环并且您有一个迭代的资源对象或变量时,它只会在页面上完成一次,因为一旦迭代完成,对象或相应的变量将获得空闲并包含 null,因此为了运行 while 循环的捆绑包,您需要定义不同的 obj,而不管您的结果集如何。

0赞 TheSatinKnight 10/9/2015 #2

-- 休息 1

在此行之前的进程中加载数据。表已发布。

从这一点开始,进一步的数据操作是在 PHP 应用程序中进行的,不再需要来自数据库的数据。

至于之前没有数据锁的评论,这取决于你的观点。如果查询快速返回两条记录,则似乎没有锁定(技术上不正确,但很容易出错)。但是,如果你的查询很复杂,结果集很大,需要一些时间才能返回结果(例如,大约45秒),那么MyISAM中确实存在一个表锁,就会变得非常明显。在 45 秒返回期间,一个简单的“show processlist”可以清楚地显示锁定的表。(等待桌子级别锁定是一种死的赠品)。每天都在较大的 Vicidial 装置上发生。

为表编制索引通常可以减少锁定时间。设置“limit 50”(限制生成的数据集的某个数字)可以减少锁定时间,如果这也是查询的可行选项。

另请注意,锁定有一些绕过方法,具体取决于尝试“播放”的查询。选择、插入和更新通常可以相互影响(这就是研究锁定机制可以派上用场的地方)。测试是一个好主意,以确保你理解它。永远不要害怕创建一个包含 3000 万条记录的表,并运行一个巨大的查询,以查看在选择/插入/更新之间哪些锁定,哪些不锁定,而其中一个很大,另一个很小,并试图在大的运行时“播放”。即使你认为你“明白了”,结果也会让你大吃一惊。然后观察是否能够明确声明查询不太重要,以及后续查询轮换其类型时会发生什么。