【问题标题】:Lock at MyISAM Table (MySQL) and PHP锁定 MyISAM 表 (MySQL) 和 PHP
【发布时间】:2014-10-30 11:20:57
【问题描述】:

MySQL 中的表是 MyISAM。

现在我想选择很多数据。

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

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

【问题讨论】:

  • 这是一本关于表锁定的好且深入的读物:dev.mysql.com/doc/refman/5.1/en/internal-locking.html
  • 也许分析 SQL 可以提供一些关于 mysql 何时释放表的想法。Details
  • 也许分析 SQL 给出了一些关于 mysql 何时释放表的想法。Details 我认为它在 Break1 因为您的查询已执行并返回结果集资源,根据 Mysql,您的结果集已设置所以同时插入或更新不会改变你的结果集
  • 请解释您的评论@sectus。
  • 我同意@Santa'shelper,根据我目前阅读的内容,当查询返回结果时应该释放锁。

标签: php mysql mysqli locking myisam


【解决方案1】:

@bauer 据我了解您的问题。靠近我的答案是,每当您使用 while 循环并且您有一个资源对象或变量进行迭代时,它只在页面上完成一次,因为一旦迭代完成,对象或相应的变量将变得免费并且包含 null,因此为了运行一系列 while 循环,您需要定义不同的 obj,而与您的结果集无关。

【讨论】:

    【解决方案2】:

    // -- 中断 1

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

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

    至于前面评论说没有数据锁,那要看你的观点了。如果您的查询快速返回两条记录,则会显示没有锁(技术上不正确,但很容易出错)。但是,如果您的查询很复杂并且您的结果集很大,这需要很长时间才能返回结果(例如大约 45 秒),那么在 MyISAM 中确实存在表锁将变得非常明显。在 45 秒返回期间的简单“显示进程列表”清楚地显示锁定的表。 (等待表级锁是一种死的赠品)。每天都会发生在大型 Vicidial 装置上。

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多