我有一個我無法複製或診斷的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。
不幸的是,因爲它沒有檢測到死鎖,所以「最新檢測死鎖」中沒有任何內容。 :-(但我認爲你是對的,我需要使用一些其他工具來定期轉儲鎖定信息,並希望我能抓住它。謝謝。 – Andrew 2010-09-28 17:15:32
我知道這可能發生,如果沒有它是一個僵局,我不100%確定這是一個僵局,我的系統中有很長時間的運行過程,但是我絞盡腦汁,確信自己沒有一個人鎖定,這就是爲什麼我正在追求替代方案,但存在僵局,但由於某種原因,InnoDB沒有發現它,但我會回去再看一個長時間的鎖。 – Andrew 2010-09-28 19:41:57