php崩溃后mysql表被锁定

时间:2011-03-02 13:01:12

标签: php mysql crash innodb table-locking

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

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

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

任何想法??

3 个答案:

答案 0 :(得分:6)

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

的Qoute
  

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

由于您的连接在页面执行并完成/处理后仍然存在,因此连接仍然存在。

你不应该使连接永久IMO

答案 1 :(得分:3)

好的,所以看完我的帖子后,我意识到我回答了自己的问题。即使在崩溃期间,连接仍然存在,因为我使用mysql_pconnect()连接到数据库。我把它改成了mysql_connect(),它运行得很好。对不起,如果我浪费了任何人的时间,但我希望这可以帮助别人!

- 约书亚

答案 2 :(得分:0)

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

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