mysql如何解決死鎖 數(shù)據(jù)庫表死鎖是如何造成的?如何避免(解決)死鎖?
數(shù)據(jù)庫表死鎖是如何造成的?如何避免(解決)死鎖?在數(shù)據(jù)庫用戶看來,事務(wù)是并發(fā)的,可以同時(shí)發(fā)生。從內(nèi)部數(shù)據(jù)庫可以看出,為了實(shí)現(xiàn)隔離,事務(wù)在概念上是按順序排列的。此順序僅適用于事務(wù)沖突的情況(沖突包括1。
數(shù)據(jù)庫表死鎖是如何造成的?如何避免(解決)死鎖?
在數(shù)據(jù)庫用戶看來,事務(wù)是并發(fā)的,可以同時(shí)發(fā)生。從內(nèi)部數(shù)據(jù)庫可以看出,為了實(shí)現(xiàn)隔離,事務(wù)在概念上是按順序排列的。此順序僅適用于事務(wù)沖突的情況(沖突包括1。讀寫2。寫和寫);如果沒有沖突,順序無關(guān)緊要。當(dāng)死鎖發(fā)生時(shí),是時(shí)候違反順序規(guī)則了。鎖定的目的是確保數(shù)據(jù)庫不會有不可序列化的異常。R從a傳輸?shù)紹,即寫入a和B。R兩個(gè)事務(wù)T1、T2、T1寫入a、寫入B、T2寫入B、寫入a、T1、T2是并發(fā)的。如果調(diào)度順序如下:T1 write a,T2 write B,T1 write B,T2 write a,T1認(rèn)為T1應(yīng)該在T2之前,而T2認(rèn)為T2應(yīng)該在T1之前,則會發(fā)生死鎖。如果鎖沖突繼續(xù),則無法序列化。R如果調(diào)度序列產(chǎn)生一個(gè)可串行化的調(diào)度(有一個(gè)等價(jià)的串行調(diào)度,語義上等價(jià)于T1在T2之前,或者T2在T1之前),那么死鎖就不會發(fā)生。如果發(fā)生死鎖,MySQL死鎖檢測將檢測到它并回滾事務(wù)。避免死鎖(理論上稱為死鎖預(yù)防)。死鎖避免是利用銀行家算法等算法動態(tài)檢測鎖請求是否會產(chǎn)生死鎖危險(xiǎn),這在數(shù)據(jù)庫用戶層是很難實(shí)現(xiàn)的。它只需要打破死鎖發(fā)生的條件(死鎖的四個(gè)條件)。數(shù)據(jù)庫用戶級可以做的是破壞循環(huán)條件,而鎖入序列不會生成循環(huán)。舉個(gè)例子。不管是從a到B還是從B到a,我們先寫a,然后再寫B(tài)以避免死鎖。死鎖有四個(gè)必要條件:(1)互斥條件:一個(gè)資源一次只能被一個(gè)進(jìn)程使用。(2) 請求和保持條件:當(dāng)一個(gè)進(jìn)程由于對資源的請求而被阻塞時(shí),它將保持所獲得的資源。(3) 非剝奪條件:通過該過程獲得的資源在用完之前不能被強(qiáng)行剝奪。(4) 循環(huán)等待條件:多個(gè)進(jìn)程之間形成循環(huán)等待資源關(guān)系。這四個(gè)條件是僵局的必要條件。只要系統(tǒng)中發(fā)生死鎖,這些條件就必須為真。只要不滿足上述條件之一,死鎖就不會發(fā)生。