|
在兩個或多個SQL Server進(jìn)程中,每一個進(jìn)程鎖定了其他進(jìn)程試圖鎖定的資源,就會出現(xiàn)死鎖,例如,
進(jìn)程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X),
進(jìn)程process2對table2持有1個排它鎖(X),同時process2對table1請求1個排它鎖(X)
類似這種情況,就會出現(xiàn)死鎖,除非當(dāng)某個外部進(jìn)程斷開死鎖,否則死鎖中的兩個事務(wù)都將無限期等待下去。
Microsoft SQL Server 數(shù)據(jù)庫引擎死鎖監(jiān)視器定期檢查陷入死鎖的任務(wù)。
如果監(jiān)視器檢測到循環(huán)依賴關(guān)系,將選擇其中一個任務(wù)作為犧牲品(通常是選擇占資源比較小的進(jìn)程作為犧牲品),然后終止其事務(wù)并提示錯誤1205。
這里我們通過SQL Server Profiler來監(jiān)視分析死鎖的發(fā)生過程,那樣我們就會深刻理解死鎖的成因。
1.創(chuàng)建測試表。
在 Microsoft SQL Server Management Studio上,新建一個查詢,寫創(chuàng)建表DealLockTest_1 & DealLockTest_2兩個表:
腳本:

--創(chuàng)建分析死鎖使用到的兩個表DealLockTest_1 & DealLockTest_2
go
Set Nocount On
Go
if object_id('DealLockTest_1') Is Not Null
Drop Table DealLockTest_1
go
Create Table DealLockTest_1
(
ID int Identity(1,1) Primary Key,
Name nvarchar(512)
)
if object_id('DealLockTest_2') Is Not Null
Drop Table DealLockTest_2
go
Create Table DealLockTest_2
(
ID int Identity(1,1) Primary Key,
Name nvarchar(512)
)
Go
--插入一些測試數(shù)據(jù)
Insert Into DealLockTest_1(Name)
Select name From sys.all_objects
Insert Into DealLockTest_2(Name)
Select name From sys.all_objects
Go
it知識庫:通過SQL Server Profiler來監(jiān)視分析死鎖,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。