您現(xiàn)在的位置是:首頁 >綜合 > 2023-08-01 09:27:08 來源:
死鎖的原因及解決方法(死鎖)
大家好,我是小華,我來為大家解答以上問題。死鎖的原因及解決方法,死鎖很多人還不知道,現(xiàn)在讓我們一起來看看吧!
1、在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)鎖定了其他任務(wù)試圖鎖定的資源,此時(shí)會(huì)造成這些任務(wù)永久阻塞,從而出現(xiàn)死鎖。
2、例如: 事務(wù) A 獲取了行 1 的共享鎖。
3、 事務(wù) B 獲取了行 2 的共享鎖。
4、 現(xiàn)在,事務(wù) A 請求行 2 的排他鎖,但在事務(wù) B 完成并釋放其對行 2 持有的共享鎖之前被阻塞。
5、 現(xiàn)在,事務(wù) B 請求行 1 的排他鎖,但在事務(wù) A 完成并釋放其對行 1 持有的共享鎖之前被阻塞。
6、 事務(wù) A 必須在事務(wù) B 完成之后才能完成,但事務(wù) B 被事務(wù) A 阻塞。
7、這種情況也稱為循環(huán)依賴關(guān)系:事務(wù) A 依賴于事務(wù) B,而事務(wù) B 又依賴于事務(wù) A,從而形成了一個(gè)循環(huán)。
8、 除非某個(gè)外部進(jìn)程斷開死鎖,否則死鎖中的兩個(gè)事務(wù)都將無限期等待下去。
9、Microsoft SQL Server Database Engine 死鎖監(jiān)視器定期檢查陷入死鎖的任務(wù)。
10、如果監(jiān)視器檢測到循環(huán)依賴關(guān)系,將選擇其中一個(gè)任務(wù)作為犧牲品,然后終止其事務(wù)并提示錯(cuò)誤。
11、這樣,其他任務(wù)就可以完成其事務(wù)。
12、對于事務(wù)以錯(cuò)誤終止的應(yīng)用程序,它還可以重試該事務(wù),但通常要等到與它一起陷入死鎖的其他事務(wù)完成后執(zhí)行。
13、 在應(yīng)用程序中使用特定編碼約定可以減少應(yīng)用程序?qū)е滤梨i的機(jī)會(huì)。
14、有關(guān)詳細(xì)信息,請參閱將死鎖減至最少。
15、 死鎖經(jīng)常與正常阻塞混淆。
16、事務(wù)請求被其他事務(wù)鎖定的資源的鎖時(shí),發(fā)出請求的事務(wù)一直等到該鎖被釋放。
17、默認(rèn)情況下,SQL Server 事務(wù)不會(huì)超時(shí)(除非設(shè)置了 LOCK_TIMEOUT)。
18、因?yàn)榘l(fā)出請求的事務(wù)未執(zhí)行任何操作來阻塞擁有鎖的事務(wù),所以該事務(wù)是被阻塞,而不是陷入了死鎖。
19、最后,擁有鎖的事務(wù)將完成并釋放鎖,然后發(fā)出請求底事務(wù)將獲取鎖并繼續(xù)執(zhí)行。
20、 死鎖有時(shí)稱為抱死。
21、 不只是關(guān)系數(shù)據(jù)庫管理系統(tǒng),任何多線程系統(tǒng)上都會(huì)發(fā)生死鎖,并且對于數(shù)據(jù)庫對象的鎖之外的資源也會(huì)發(fā)生死鎖。
22、例如,多線程操作系統(tǒng)中的一個(gè)線程要獲取一個(gè)或多個(gè)資源(例如,內(nèi)存塊)。
23、如果要獲取的資源當(dāng)前為另一線程所擁有,則第一個(gè)線程可能必須等待擁有線程釋放目標(biāo)資源。
24、這就是說,對于該特定資源,等待線程依賴于擁有線程。
25、在數(shù)據(jù)庫引擎 實(shí)例中,當(dāng)獲取非數(shù)據(jù)庫資源(例如,內(nèi)存或線程)時(shí),會(huì)話會(huì)死鎖。
26、 在上圖中,對于 Part 表鎖資源,事務(wù) T1 依賴于事務(wù) T2。
27、同樣,對于 Supplier 表鎖資源,事務(wù) T2 依賴于事務(wù) T1。
28、因?yàn)檫@些依賴關(guān)系形成了一個(gè)循環(huán),所以在事務(wù) T1 和事務(wù) T2 之間存在死鎖。
本文到此講解完畢了,希望對大家有幫助。