1. 程式人生 > >死鎖和死鎖檢測

死鎖和死鎖檢測

在線 才有 inf 發現 情況 接受 等待時間 正常 lock

技術分享圖片

如圖所示,事務A在等待事務B釋放id=2的鎖,事務B在等待事務A釋放id=1的鎖

這種情況就是死鎖

發生死鎖有兩種方法解決

1.直接進入等待,直到超時。這個超時時間可以通過參數innodb_lock_wait_timeout來設置

2.發起死鎖檢測,發現死鎖後,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以執行。

將參數innodb_deadlock_detect設置為on,表示開啟這個邏輯

在innodb中,innodb_lock_wait_timeout的值默認是50s,以為著如果使用第一種方法,

第一個被鎖住的線程要過50s才會超時退出,然後其他線程才有可能繼續執行。

對於在線服務來說,這個等待時間往往是無法接受的。

但是我們又不能把這個時間設置的很小,比如1s,如果這個時候不是死鎖,而是正常的鎖等待呢

這樣就會造成很多誤傷,所以我們還是使用死鎖檢測好一些,好在innodb_deadlock_detect默認就是on

其實死鎖檢測也是會占用很多cpu資源的,當事務被鎖住的時候,就要看看它鎖依賴的線程有沒有被別人鎖住

如此循環,最後判斷是否出現了循環等待,也就是死鎖

死鎖和死鎖檢測