|
1. 死鎖原理
根據(jù)操作系統(tǒng)中的定義:死鎖是指在一組進(jìn)程中的各個(gè)進(jìn)程均占有不會(huì)釋放的資源,但因互相申請(qǐng)被其他進(jìn)程所站用不會(huì)釋放的資源而處于的一種永久等待狀態(tài)。
死鎖的四個(gè)必要條件:
互斥條件(Mutual exclusion):資源不能被共享,只能由一個(gè)進(jìn)程使用。
請(qǐng)求與保持條件(Hold and wait):已經(jīng)得到資源的進(jìn)程可以再次申請(qǐng)新的資源。
非剝奪條件(No pre-emption):已經(jīng)分配的資源不能從相應(yīng)的進(jìn)程中被強(qiáng)制地剝奪。
循環(huán)等待條件(Circular wait):系統(tǒng)中若干進(jìn)程組成環(huán)路,該環(huán)路中每個(gè)進(jìn)程都在等待相鄰進(jìn)程正占用的資源。
對(duì)應(yīng)到SQL Server中,當(dāng)在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)鎖定了其他任務(wù)試圖鎖定的資源,此時(shí)會(huì)造成這些任務(wù)永久阻塞,從而出現(xiàn)死鎖;這些資源可能是:?jiǎn)涡?/span>(RID,堆中的單行)、索引中的鍵(KEY,行鎖)、頁(yè)(PAG,8KB)、區(qū)結(jié)構(gòu)(EXT,連續(xù)的8頁(yè))、堆或B樹(HOBT) 、表(TAB,包括數(shù)據(jù)和索引)、文件(File,數(shù)據(jù)庫(kù)文件)、應(yīng)用程序?qū)S觅Y源(APP)、元數(shù)據(jù)(METADATA)、分配單元(Allocation_Unit)、整個(gè)數(shù)據(jù)庫(kù)(DB)。一個(gè)死鎖示例如下圖所示:
說(shuō)明:T1、T2表示兩個(gè)任務(wù);R1和R2表示兩個(gè)資源;由資源指向任務(wù)的箭頭(如R1->T1,R2->T2)表示該資源被改任務(wù)所持有;由任務(wù)指向資源的箭頭(如T1->S2,T2->S1)表示該任務(wù)正在請(qǐng)求對(duì)應(yīng)目標(biāo)資源;
其滿足上面死鎖的四個(gè)必要條件:
(1).互斥:資源S1和S2不能被共享,同一時(shí)間只能由一個(gè)任務(wù)使用;
(2).請(qǐng)求與保持條件:T1持有S1的同時(shí),請(qǐng)求S2;T2持有S2的同時(shí)請(qǐng)求S1;
(3).非剝奪條件:T1無(wú)法從T2上剝奪S2,T2也無(wú)法從T1上剝奪S1;
(4).循環(huán)等待條件:上圖中的箭頭構(gòu)成環(huán)路,存在循環(huán)等待。
2. 死鎖排查
(1). 使用SQL Server的系統(tǒng)存儲(chǔ)過(guò)程sp_who和sp_lock,可以查看當(dāng)前數(shù)據(jù)庫(kù)中的鎖情況;進(jìn)而根據(jù)objectID(@objID)(SQL Server 2005)/ object_name(@objID)(Sql Server 2000)可以查看哪個(gè)資源被鎖,用dbcc ld(@blk),可以查看最后一條發(fā)生給SQL Server的Sql語(yǔ)句;

























































it知識(shí)庫(kù):SQL Server死鎖總結(jié),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。