2011-03-02 48 views
1

我有一個MySQL DB和一個innoDB表。我有一個PHP頁面連接,鎖定表格,做一些更新,然後解鎖表格。 PHP頁面正在通過wamp通過apache提供。MySQL表鎖定後php崩潰

php頁面上傳文件到數據庫。我決定通過上傳一個比分配給PHP的內存大的文件來模擬系統崩潰。這肯定導致了這個錯誤:允許內存大小18874368字節耗盡(試圖分配6176754字節)。之後,更新期間鎖定的表仍然被鎖定。

在此錯誤發生後,當我嘗試訪問表時出現錯誤:表'a'未鎖定LOCK TABLES。我知道這是一個鎖問題,因爲我會提出一個SQL提示符,並嘗試從被鎖定的表中進行選擇,並且只是等待,就像鎖定表時一樣。如果我終止了Apache進程,那麼我試圖在SQL提示符下運行的語句將最終通過。我的猜測是,當我殺死Apache進程時,MySQL意識到應該釋放表鎖,因爲連接被切斷。

任何想法??

回答

5

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

If the connection for a client session terminates, whether normally or abnormally, the server implicitly releases all table locks held by the session (transactional and nontransactional). If the client reconnects, the locks will no longer be in effect. In addition, if the client had an active transaction, the server rolls back the transaction upon disconnect, and if reconnect occurs, the new session begins with autocommit enabled.

當你的連接頁面後持續已經執行並完成/處置的連接仍然存在。

您不應該使連接持久IMO

3

好的,在閱讀我的文章後,我意識到我有點回答我自己的問題。即使通過崩潰,連接仍然存在,因爲我使用mysql_pconnect()連接到數據庫。我將其更改爲mysql_connect(),它工作得很好。對不起,如果我浪費了任何人的時間,但我希望這可以幫助別人!

--Joshua