2

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

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

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

有任何想法吗??

4

3 回答 3

6

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

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

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

你不应该使连接持久IMO

于 2011-03-02T13:09:43.340 回答
3

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

——约书亚

于 2011-03-02T13:05:54.353 回答
0

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

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

于 2011-03-02T13:06:05.113 回答