事務(wù) A 在事務(wù) B 完成之前無(wú)法完成,但事務(wù) B 被事務(wù) A 阻止。此條件也稱為循環(huán)依賴關(guān)系:事務(wù) A 依賴于事務(wù) B,事務(wù) B 通過(guò)對(duì)事務(wù) A 的依賴來(lái)關(guān)閉循環(huán)。
死鎖中的兩個(gè)事務(wù)將永遠(yuǎn)等待,除非死鎖被外部進(jìn)程打破。SQL Server 數(shù)據(jù)庫(kù)引擎死鎖監(jiān)視器定期檢查處于死鎖狀態(tài)的任務(wù)。如果監(jiān)視器檢測(cè)到循環(huán)依賴關(guān)系,它將選擇其中一個(gè)任務(wù)作為受害者,并在出現(xiàn)錯(cuò)誤的情況下終止其事務(wù)。這允許其他任務(wù)完成其事務(wù)。具有因錯(cuò)誤而終止的事務(wù)的應(yīng)用程序可以重試該事務(wù),該事務(wù)通常在另一個(gè)死鎖事務(wù)完成后完成。
死鎖經(jīng)常與正常阻塞混淆。當(dāng)一個(gè)事務(wù)請(qǐng)求鎖定另一個(gè)事務(wù)鎖定的資源時(shí),請(qǐng)求事務(wù)將等待,直到鎖定被釋放。默認(rèn)情況下,除非設(shè)置了LOCK_TIMEOUT,否則 SQL Server 事務(wù)不會(huì)超時(shí)。請(qǐng)求事務(wù)被阻止,而不是死鎖,因?yàn)檎?qǐng)求事務(wù)沒(méi)有執(zhí)行任何操作來(lái)阻止擁有鎖的事務(wù)。最終,擁有事務(wù)將完成并釋放鎖,然后請(qǐng)求事務(wù)將被授予鎖定并繼續(xù)。死鎖幾乎可以立即解決,而阻塞理論上可以無(wú)限期地持續(xù)存在。僵局有時(shí)被稱為致命的擁抱。
死鎖是可能發(fā)生在具有多個(gè)線程的任何系統(tǒng)上的情況,而不僅僅是在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)上,并且可能發(fā)生在數(shù)據(jù)庫(kù)對(duì)象上的鎖以外的資源上。例如,多線程操作系統(tǒng)中的線程可能會(huì)獲取一個(gè)或多個(gè)資源,例如內(nèi)存塊。如果要獲取的資源當(dāng)前由另一個(gè)線程擁有,則第一個(gè)線程可能必須等待擁有該線程釋放目標(biāo)資源。據(jù)說(shuō)等待線程依賴于該特定資源的擁有線程。在 SQL Server 數(shù)據(jù)庫(kù)引擎實(shí)例中,會(huì)話在獲取非數(shù)據(jù)庫(kù)資源(如內(nèi)存或線程)時(shí)可能會(huì)死鎖。