Mysql對死鎖的處理

2021-09-29 23:41:50 字數 615 閱讀 7878

官方定義如下: 兩個事務都持有對方需要的鎖, 並且在等待對方釋放, 並且雙方都不會釋放自己的鎖。

由於效能原因, 一般都是使用死鎖檢測來進行處理死鎖。

死鎖檢測的原理是構建乙個以事務為頂點、 鎖為邊的有向圖, 判斷有向圖是否存在環, 存在即有死鎖。

檢測到死鎖之後, 選擇插入更新或者刪除的行數最少的事務回滾,

基於information_schema.innodb_trx 表中的 trx_weight 欄位來判斷。

innodb儲存引擎由於實現了行級鎖, 顆粒更小, 實現更複雜。

但是innodb行鎖在併發效能上遠遠要高於表鎖頁鎖。

在使用方面可以盡量做到以下幾點;

控制事務大小, 減少鎖定的資源量和鎖定時間長度。

所有的資料檢索都通過索引來完成, 從而避免因為無法通過索引加鎖而公升級為表鎖。

減少基於範圍的資料檢索過濾條件, 避免因為間隙鎖帶來的負面影響而鎖定了不該鎖定的資料。

在業務條件允許下, 盡量使用較低隔離級別的事務隔離。 減少隔離級別帶來的附加成本。

合理使用索引, 讓innodb在索引上面加鎖的時候更加準確。

在應用中盡可能做到訪問的順序執行

如果容易死鎖, 就可以考慮使用表鎖來減少死鎖的概率

mysql處理死鎖 mysql如何處理死鎖問題

mysql有兩種死鎖處理方式 1 等待,直到超時 innodb lock wait timeout 50s 2 發起死鎖檢測,主動回滾一條事務,讓其他事務繼續執行 innodb deadlock detect on 由於效能原因,一般都是使用死鎖檢測來進行處理死鎖。死鎖檢測 死鎖檢測的原理是構建乙個...

MySQL如何處理死鎖

官方定義如下 兩個事務都持有對方需要的鎖,並且在等待對方釋放,並且雙方都不會釋放自己的鎖。這個就好比你有乙個人質,對方有乙個人質,你們倆去談判說換人。你讓對面放人,對面讓你放人。看到這裡,也許你會有這樣的疑問,事務和談判不一樣,為什麼事務不能使用完鎖之後立馬釋放呢?居然還要操作完了之後一直持有鎖?這...

mysql 死鎖模擬 Mysql的死鎖

專案經常會出現mysql的死鎖問題,當年年少總是想通過select from information schema.innodb locks 檢視被鎖的事務,然後kill掉他,或者重啟mysql,唉,治標不治本啊,下次還會出現這些問題,其實造成死鎖大多數情況就是我們的sql寫的不大好。我們先來模擬一...