【问题标题】:mysql table locked after php crashesphp崩溃后mysql表被锁定
【发布时间】:2011-03-02 13:01:12
【问题描述】:

我有一个 MySQL 数据库和一个 innoDB 表。我有一个连接、锁定表、进行一些更新、然后解锁表的 php 页面。 PHP 页面正在通过 wamp 与 apache 一起提供。

php页面上传一个文件到数据库。我决定通过上传一个大于分配给 PHP 的内存的文件来模拟系统崩溃。这肯定会导致这个错误:允许的内存大小为 18874368 字节已用尽(试图分配 6176754 字节)。之后,在更新期间被锁定的表仍然被锁定。

在出现此错误后尝试访问表时出现的错误是:表“a”未使用 LOCK TABLES 锁定。我知道这是一个锁定问题,因为我会弹出一个 SQL 提示并尝试从被锁定的表中进行选择,它只是等待,就像在表被锁定时一样。如果我随后终止 Apache 进程,我试图在 SQL 提示符中运行的语句最终将通过。我的猜测是,当我杀死 Apache 进程时,MySQL 意识到由于连接被切断,应该释放表锁。

有什么想法吗??

【问题讨论】:

    标签: php mysql crash innodb table-locking


    【解决方案1】:

    引用自:http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

    如果客户端会话的连接终止,无论是正常还是异常,服务器都会隐式释放会话持有的所有表锁(事务性和非事务性)。如果客户端重新连接,锁将不再有效。此外,如果客户端有一个活动事务,服务器会在断开连接时回滚事务,如果发生重新连接,则新会话以启用自动提交开始。

    由于您的连接在页面执行并完成/释放后仍然存在。

    您不应该使连接持久 IMO

    【讨论】:

      【解决方案2】:

      好的,所以在阅读了我的帖子后,我意识到我有点回答了我自己的问题。即使发生崩溃,连接仍然存在,因为我使用 mysql_pconnect() 连接到数据库。我将其更改为 mysql_connect(),它工作得很好。对不起,如果我浪费了任何人的时间,但我希望这可以帮助别人!

      --约书亚

      【讨论】:

        【解决方案3】:

        您可以使用关闭功能来解锁表:

        http://php.net/manual/en/function.register-shutdown-function.php

        【讨论】:

        • 我的错误 - 我正在考虑关闭功能。答案已修改。
        猜你喜欢
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多