死鎖的四個必要條件:
互斥條件(Mutual exclusion):資源不能被共享,只能由一個進(jìn)程使用。
請求與保持條件(Hold and wait):已經(jīng)得到資源的進(jìn)程可以再次申請新的資源。
非剝奪條件(No pre-emption):已經(jīng)分配的資源不能從相應(yīng)的進(jìn)程中被強(qiáng)制地剝奪。
循環(huán)等待條件(Circular wait):系統(tǒng)中若干進(jìn)程組成環(huán)路,該環(huán)路中每個進(jìn)程都在等待相鄰進(jìn)程正占用的資源。
系統(tǒng)背景:
日處理數(shù)據(jù)不到10W,總數(shù)據(jù)千萬+的中小型業(yè)務(wù)系統(tǒng),運(yùn)行2年半,基本上每2周迭代一次
最近業(yè)務(wù)操作時不時報出死鎖被犧牲,每天出現(xiàn)2,3次,概率很低 但是一直存在
出現(xiàn)問題以后,我們首先做的就是把業(yè)務(wù)操作異步處理,業(yè)務(wù)提交的數(shù)據(jù),做基本的檢查之后就放到隊列中,然后隊列再去循環(huán)處理隊列的數(shù)據(jù)
這樣并發(fā)的概率減小了,就算再次死鎖,客戶也不會感知到
然后降低單次事務(wù)的處理時長;
1.把查詢SQL拿出事務(wù)單獨(dú)查詢,
2.對于一些對時效不敏感的可以異步處理的業(yè)務(wù)剝離開來,晚上再集中批次處理
3.對于事務(wù)處理中有依賴于外部接口數(shù)據(jù)的,可以先調(diào)用接口再開啟事務(wù),對接口的訪問一定不要直接放入事務(wù)中
然后我們分析為什么會出現(xiàn)死鎖
根據(jù)死鎖的原則,必然是出現(xiàn)了SQL執(zhí)行順序不當(dāng),導(dǎo)致循環(huán)等待,以下是分析死鎖出現(xiàn)的程序
線程A和B同時執(zhí)行,看執(zhí)行結(jié)果,
線程A修改表1->等待2秒->線程B修改表2->等待2秒->線程B修改表1等待A->線程A修改表2等待B 死鎖
線程A:修改鎖住表1->等待2秒->修改表2 此時表2被鎖住了 等待B釋放
線程B:修改鎖住表2->等待2秒->修改表1 此時表1是被鎖住的 等待A釋放

修改腳本的執(zhí)行順序就能解決此死鎖.
業(yè)務(wù)系統(tǒng)處理此問題 給每個表制定編號,然后檢查系統(tǒng)按照此編號來執(zhí)行修改
浙公網(wǎng)安備 33010602011771號