造成mysql死鎖的原因:兩個或兩個以上的進程在執(zhí)行過程中爭奪資源。mysql中有三種鎖,分別是表級鎖、行級鎖和頁面鎖。其中,表級鎖開銷小、加鎖快,不會出現(xiàn)死鎖情況。
mysql是一種關系型數(shù)據(jù)庫管理系統(tǒng),使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。在mysql的使用過程中,會有死鎖的情況發(fā)生,這產(chǎn)生的原因是什么呢?
MySQL的三種鎖:
表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般
算法:
next KeyLocks鎖,同時鎖住記錄(數(shù)據(jù)),并且鎖住記錄前面的Gap ? ?
Gap鎖,不鎖記錄,僅僅記錄前面的Gap
Recordlock鎖(鎖數(shù)據(jù),不鎖Gap)
所以其實 Next-KeyLocks=Gap鎖+ Recordlock鎖
什么情況下會造成死鎖
所謂死鎖
表級鎖不會產(chǎn)生死鎖.所以解決死鎖主要還是針對于最常用的InnoDB.
死鎖的關鍵在于:兩個(或以上)的Session加鎖的順序不一致。
那么對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序。