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