2010-09-28 19 views
3

我有一個我無法複製或診斷的MySQL出現的「鎖超時超時」錯誤。我相信它是死鎖(與一個交易抓住鎖然後旋轉拇指)相反,因爲我的日誌顯示另一個進程同時啓動,也掛起,然後在第一次超時時繼續。但通常情況下,InnoDB在沒有超時的情況下檢測死鎖。所以我想了解爲什麼沒有發現這個僵局。InnoDB何時超時而不報告死鎖?

交易都是使用隔離級別序列化。 (我對這個隔離級別的InnoDB鎖定有一個公正的理解。)在事務中有一個非InnoDB(MyISAM)表,我插入並更新它。然而,我不明白它是如何參與到死鎖中的,因爲我相信MyISAM在插入和更新過程中只需要一個表鎖(因爲MyISAM不是事務性的,所以會立即釋放它),所以在此時不會再有其他鎖表鎖被保持。

所以我相信僵局只涉及InnoDB表,這使我回爲什麼沒有檢測到的問題。 MySQL文檔(http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlock-detection.html)意味着死鎖檢測幾乎總是有效的。我在搜索時發現的問題涉及諸如顯式「鎖定表」,「改變表」和「插入延遲」之類的事情。我沒有做任何這些事情,只是插入,更新和選擇(我的一些選擇是「更新」)。

我試圖通過創建一個MyISAM表和一對夫婦InnoDB表和做插入和更新的各種序列引入的MyISAM重現,而「選擇更新」中的InnoDB秒。但是每次我產生僵局時,InnoDB都會立即報告。我無法重現超時。

任何其他提示診斷呢?我正在使用MySQL 5.1.49。

回答

3

一個技巧是,你可以使用SHOW INNODB STATUS來,你猜對了,顯示InnoDB引擎的地位。

它返回的信息(文本的大帥哥),包括目前的表鎖信息,最後檢測死鎖(在標題"LATEST DETECTED DEADLOCK"),所以在事後好這一招是沒有多大用處的,但它可以幫助您追蹤正在發生的掛起的查詢。

mysqladmin debug還可以打印有用鎖調試信息。

第三個技巧是創建一個名爲innodb_lock_monitor的神奇命名錶,如http://dev.mysql.com/doc/refman/5.1/en/innodb-monitors.html所述,該表給出了更詳細的鎖調試。

HTH!

UPDATE

它可能無法檢測死鎖監守它實際上不是一個僵局,但更可能是一個進程正在等待上一行行鎖被另一個進程鎖定。從手動用於innodb_lock_wait_timeout變量:

The timeout in seconds an InnoDB transaction may wait for a row lock before giving up. The default value is 50 seconds. A transaction that tries to access a row that is locked by another InnoDB transaction will hang for at most this many seconds before issuing the following error:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction When a lock wait timeout occurs, the current statement is not executed. The current transaction is not rolled back. (Until MySQL 5.0.13 InnoDB rolled back the entire transaction if a lock wait timeout happened.

死鎖發生時,例如,當每兩個過程需要鎖定由其它進程鎖定行,並沒有等待量將解決衝突。

+0

不幸的是,因爲它沒有檢測到死鎖,所以「最新檢測死鎖」中沒有任何內容。 :-(但我認爲你是對的,我需要使用一些其他工具來定期轉儲鎖定信息,並希望我能抓住它。謝謝。 – Andrew 2010-09-28 17:15:32

+0

我知道這可能發生,如果沒有它是一個僵局,我不100%確定這是一個僵局,我的系統中有很長時間的運行過程,但是我絞盡腦汁,確信自己沒有一個人鎖定,這就是爲什麼我正在追求替代方案,但存在僵局,但由於某種原因,InnoDB沒有發現它,但我會回去再看一個長時間的鎖。 – Andrew 2010-09-28 19:41:57

1

我設法重現和診斷問題。這是一個涉及MyISAM和InnoDB的僵局。它似乎是事務性InnoDB行鎖定和非事務性MyISAM表鎖定之間的交互。我提交了一個bug:http://bugs.mysql.com/bug.php?id=57118。無論如何,我相信我原來的問題的答案是,InnoDB應該始終檢測死鎖,除非MySQL中存在錯誤。 ;-)