前言
之前接觸到的數(shù)據(jù)庫死鎖,都是批量更新時加鎖順序不一致而導(dǎo)致的死鎖,但是上周卻遇到了一個很難理解的死鎖。借著這個機會又重新學(xué)習(xí)了一下mysql的死鎖知識以及常見的死鎖場景。在多方調(diào)研以及和同事們的討論下終于發(fā)現(xiàn)了這個死鎖問題的成因,收獲頗多。雖然是后端程序員,我們不需要像DBA一樣深入地去分析與鎖相關(guān)的源碼,但是如果我們能夠掌握基本的死鎖排查方法,對我們的日常開發(fā)還是大有裨益的。
PS:本文不會介紹死鎖的基本知識,mysql的加鎖原理可以參考本文的參考資料提供的鏈接。
死鎖起因
先介紹一下數(shù)據(jù)庫和表情況,因為涉及到公司內(nèi)部真是的數(shù)據(jù),所以以下都做了模擬,不會影響具體的分析。
我們采用的是5.5版本的mysql數(shù)據(jù)庫,事務(wù)隔離級別是默認(rèn)的RR(Repeatable-Read),采用innodb引擎。假設(shè)存在test表: