【问题标题】:InnoDB FOR UPDATE Transaction causes php fatal error, Maximum Execution timeInnoDB FOR UPDATE Transaction 导致 php 致命错误,最大执行时间
【发布时间】:2012-07-25 23:25:00
【问题描述】:

情况如下: 1- MySQL InnoDB 表进行事务选择如下:

     <?php

        ....
        doQuery('START TRANSACTION');
        $sql = "SELECT * FROM table where amount < 10 FOR UPDATE";
       $res = $doQuery($sql);
// Then a looping through $res includes updates to some fields -amount field- in the same table and set it to values greater than 10

//After the loop
doQuery('COMMIT');

在 XAMPP localhost,我打开了两个不同浏览器的窗口,FireFox 和 Opera,同时请求脚本 URL。我希望其中只有一个能够检索 $res 的值。但是,该脚本返回胎儿错误

块引用 致命错误:超过 30 秒的最大执行时间

我需要知道这个错误的原因吗?是因为 FireFox 和 Opera 这两个客户端无法选择还是因为它们无法更新? 我还需要一个保持交易并给我预期结果的解决方案,即只有一个浏览器可以返回结果!

【问题讨论】:

  • 您的问题与浏览器无关。表中有多少行?你的更新声明是什么样的?
  • 此时表格行数不超过30行,非常少!关于更新语句,它在循环内部执行并更新$res中的记录。

标签: php mysql transactions innodb cakephp-1.2


【解决方案1】:

您可以在脚本顶部添加set_time_limit(0);,但这对于通过 http 访问的脚本来说不是一个好的解决方案。

【讨论】:

  • 我认为这不是解决方案,因为问题不在执行时间本身,它与事务中生成的锁有关。到目前为止,数据库中的记录总数不超过 30 条记录。换句话说,在最长的循环中,它可能会循环最多 3 到 5 次。
  • 哦,因为您的答案是唯一的答案,在我的考试中它解决了一些问题并澄清了一些概念,我发现它是最接近正确的答案。但是,它需要将时间限制设置为大于默认为 50 秒的 innodb_lock_wait_timeout。但是,innodb_lock_wait_timeout 的动态集 - 在运行时 - 在 MySQL 5.6 之前不可用,大多数主机运行 5.1。
【解决方案2】:

您的脚本输入dead lock。为避免这种情况,请在查询中添加ORDER BY,以确保两个查询都尝试以相同的顺序选择记录。还要确保amount 上有索引,否则查询将不得不锁定整个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2015-11-01
    • 2011-01-09
    • 2013-09-03
    • 2014-04-20
    相关资源
    最近更新 更多