2013-05-15 61 views
2

任何人都可以解釋我在MySQL 5.1上找到的死鎖和Lockwait錯誤的細節。它是一樣的嗎?什麼時候發生死鎖錯誤以及鎖定超時發生在什麼時候?MySQL上的死鎖與Lockwait超時

回答

13

死鎖發生其中存在交易必須爲了繼續獲得鎖之間的循環依賴關係:例如,假設事務1持有鎖A,但需要獲得鎖B至前進;並且交易2持有鎖B但需要獲得鎖A以繼續進行—交易是立即死鎖(不需要超時)並且兩者都可以繼續,直到釋放其鎖。因此,唯一的解決方案是回滾一個事務(應用程序代碼應檢測到這種可能性並進行相應處理,通常是通過再次嘗試事務)。

等待超時當配置的超時週期(例如innodb_lock_wait_timeout InnoDB的鎖的情況下 )爲止,而事務等待一個鎖,也許是因爲一個緩慢的查詢持有鎖並且尚未完成執行發生。如果事務等待時間更長,則可能(甚至有可能)該鎖將變爲可用並被獲取,但是存在超時以避免應用程序無限期地等待數據庫。

1

死鎖是兩個線程無限等待在同一件事情上。 鎖定等待超時表示一個線程在等待鎖定時超時,從而防止死鎖。

+0

這篇文章中的大部分內容都是錯誤的。新來者請採取eggyal的答案。 –