前面我們了解了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死鎖問題的!