8)MySQL死鎖及解決方案

前面我們了解了MySQL的鎖類型,那么在使用鎖之后,大概率會(huì)出現(xiàn)死鎖的情況。

什么是死鎖

死鎖是并發(fā)系統(tǒng)中常見的問題,同樣也會(huì)出現(xiàn)在數(shù)據(jù)庫MySQL的并發(fā)讀寫請(qǐng)求場(chǎng)景中。當(dāng)兩個(gè)及以上的事務(wù),雙方都在等待對(duì)方釋放已經(jīng)持有的鎖或因?yàn)榧渔i順序不一致造成循環(huán)等待鎖資源,就會(huì)出現(xiàn)“死鎖”。
常見的報(bào)錯(cuò)信息為 ” Deadlock found when trying to get lock... ”。
舉例來說 A 事務(wù)持有 X1 鎖 ,申請(qǐng) X2 鎖,B事務(wù)持有 X2 鎖,申請(qǐng) X1 鎖。A 和 B 事務(wù)持有鎖并且申請(qǐng)對(duì)方持有的鎖進(jìn)入循環(huán)等待,就造成了死鎖。這個(gè)跟多線程加鎖發(fā)生死鎖的情況是一樣的。

死鎖日志

執(zhí)行show engine innodb status;可以查看到最近一次死鎖的日志。

死鎖日志

死鎖案例

案例其實(shí)不需要多講了,因?yàn)槿绻际切墟i,就盡量避免業(yè)務(wù)1去先更新A再更新B的時(shí)候,另一個(gè)業(yè)務(wù)2去更新B之后再更新A。
還有一種情況就是間隙鎖的各種情況,舉例業(yè)務(wù)1去刪除了一個(gè)不存在的id,申請(qǐng)到了間隙鎖,而業(yè)務(wù)2去插入這個(gè)間隙之內(nèi)的值,導(dǎo)致死鎖。

Refer:搜狐三面:說說你是怎么解決MySQL死鎖問題的!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容