IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當前所在位置: 首頁數(shù)據(jù)庫MSSQL → 詳解SQL Server Profiler分析死鎖幾大步驟

詳解SQL Server Profiler分析死鎖幾大步驟

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

本文將為大家講的是SQL Server Profiler分析死鎖幾大步驟,這里也是為了大家更好的做好數(shù)據(jù)庫的管理工作。

在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現(xiàn)死鎖,例如,進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X), 進程process2對table2持有1個排它鎖(X),同時process2對table1請求1個排它鎖(X) 類似這種情況,就會出現(xiàn)死鎖,除非當某個外部進程斷開死鎖,否則死鎖中的兩個事務都將無限期等待下去。

Microsoft SQL Server 數(shù)據(jù)庫引擎死鎖監(jiān)視器定期檢查陷入死鎖的任務。

如果監(jiān)視器檢測到循環(huán)依賴關系,將選擇其中一個任務作為犧牲品(通常是選擇占資源比較小的進程作為犧牲品),然后終止其事務并提示錯誤1205。

這里我們通過SQL Server Profiler來監(jiān)視分析死鎖的發(fā)生過程,那樣我們就會深刻理解死鎖的成因。

1.創(chuàng)建測試表。

在 Microsoft SQL Server Management Studio上,新建一個查詢,寫創(chuàng)建表DealLockTest_1 & DealLockTest_2兩個表:

腳本:

  1. useTest
  2. --創(chuàng)建分析死鎖使用到的兩個表DealLockTest_1&DealLockTest_2
  3. go
  4. SetNocountOn
  5. Go
  6. ifobject_id('DealLockTest_1')IsNotNull
  7. DropTableDealLockTest_1
  8. go
  9. CreateTableDealLockTest_1
  10. (
  11. IDintIdentity(1,1)PrimaryKey,
  12. Namenvarchar(512)
  13. )
  14. ifobject_id('DealLockTest_2')IsNotNull
  15. DropTableDealLockTest_2
  16. go
  17. CreateTableDealLockTest_2
  18. (
  19. IDintIdentity(1,1)PrimaryKey,
  20. Namenvarchar(512)
  21. )
  22. Go
--插入一些測試數(shù)據(jù)
  1. InsertIntoDealLockTest_1(Name)
  2. SelectnameFromsys.all_objects
  3. InsertIntoDealLockTest_2(Name)
  4. SelectnameFromsys.all_objects
  5. Go
?

創(chuàng)建好表和插入測試數(shù)據(jù)后,先執(zhí)行腳本代碼(因為我們不需要跟蹤該代碼),緊接著,我們就模擬兩個會話,一個會話里面包含一個事務。這里我們就新建兩個查詢,其中第一個會話,是更新DealLockTest_1表后,等待5秒鐘,更新DealLocktest_2.

  1. UseTest
  2. Go
  3. --第一個會話
  4. BeginTran
  5. UpdateDealLockTest_1
  6. SetName=N'test1'
  7. WhereID>0
  8. /*這里的Waitfor等待,是為了容易獲取死鎖的發(fā)生*/
  9. WaitforDelay'00:00:05'
  10. UpdateDealLockTest_2
  11. SetName=N'test2'
  12. WhereID>0
  13. CommitTran
  14. Go

?

代碼寫好后,我們先不要執(zhí)行代碼,接下來就寫第二個會話代碼; 第二個會話更新表的順序,剛好與第一個會話相反,是更新DealLockTest_2表后,等待5秒鐘,更新DealLocktest_1.

  1. UseTest
  2. Go
  3. --第二個會話
  4. BeginTran
  5. UpdateDealLockTest_2
  6. SetName=N'test1'
  7. WhereID>0
  8. /*這里的Waitfor等待,是為了容易獲取死鎖的發(fā)生*/
  9. WaitforDelay'00:00:05'
  10. UpdateDealLockTest_1
  11. SetName=N'test2'
  12. WhereID>0
  13. CommitTran
  14. Go

?

第二個會話代碼,也先不要執(zhí)行。

2.啟動SQL Server Profiler,創(chuàng)建Trace(跟蹤).

啟動SQL Server Profiler工具(在Microsoft SQL Server Management Studio的工具菜單上就發(fā)現(xiàn)它),創(chuàng)建一個Trace,Trace屬性選擇主要是包含:

Deadlock graph Lock: Deadlock Lock: Deadlock Chain RPC:Completed SP:StmtCompleted SQL:BatchCompleted SQL:BatchStarting

主要特性

點執(zhí)行按鈕,啟動Trace。

3.執(zhí)行測試代碼&監(jiān)視死鎖。

轉(zhuǎn)到 Microsoft SQL Server Management Studio界面,執(zhí)行第一個會話&第二個會話的代碼,稍稍等待5秒鐘,我們就會發(fā)現(xiàn)其中一個會話收到報錯消息

報錯

我們再切換到SQL Server Profiler界面,就能發(fā)現(xiàn)SQL Server Profiler收到執(zhí)行腳本過程發(fā)生死鎖的信息。

死鎖

OK,這里就先停止SQL Server Profiler上的"暫停跟蹤" Or "停止跟蹤"按鈕,下面我們具體分析死鎖發(fā)生過程。

4.分析死鎖

如下圖,我們可以看到第一個會話在SPID 54,第二個會話在SPID 55,一旦SQL Server發(fā)現(xiàn)死鎖,它就會確定一個優(yōu)勝者,可成功執(zhí)行,和另一個作為犧牲品,要回滾。

可以到看到EventClass列中,兩條SQL:BatchCompleted事件緊跟在Lock:DealLock后面,其中一條,它就是作為犧牲品,它會被回滾.而另一條SQL:BatchCompleted將會是優(yōu)勝者,成功執(zhí)行。

那么,誰是優(yōu)勝者,誰是犧牲品呢? 不用著急,通過DealLock graph事件,所返回來的信息,我們可以知道結(jié)果。

結(jié)果

我們雖然不能明白DealLock graph圖示的含義,但通過圖中描述的關系,我們知道一些有用的信息。圖中左右兩旁橢圓形相當一個處理節(jié)點(Process Node),當鼠標移動到上面的時候,可以看到內(nèi)部執(zhí)行的代碼,如Insert,UPdate,Delete.有打叉的左邊橢圓形就是犧牲者,沒有打叉的右邊橢圓形是優(yōu)勝者。中間兩個長方形就是一個資源節(jié)點(Resource Node),描述數(shù)據(jù)庫中的對象,如一個表、一行或一個索引。在我們當前的實例中,資源節(jié)點描述的是,在聚集索引請求獲得排它鎖(X)。橢圓形與長方形之間,帶箭頭的連線表示,處理節(jié)點與資源節(jié)點的關系,包含描述鎖的模式.

接下來我們更詳細的看圖里面的數(shù)據(jù)說明。

先看右邊作為優(yōu)勝者的這橢圓形,我們可以看到內(nèi)容包含有:

服務器進程 ID: 服務器進程標識符 (SPID),即服務器給擁有鎖的進程分配的標識符。服務器批 ID: 服務器批標識符 (SBID)。執(zhí)行上下文 ID: 執(zhí)行上下文標識符 (ECID)。與指定 SPID 相關聯(lián)的給定線程的執(zhí)行上下文 ID。ECID = {0,1,2,3, ...n},其中 0 始終表示主線程或父線程

關鍵詞標簽:SQL Server Profiler

相關閱讀

文章評論
發(fā)表評論

熱門文章 淺談JSP JDBC來連接SQL Server 2005的方法 淺談JSP JDBC來連接SQL Server 2005的方法 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 SqlServer2005對現(xiàn)有數(shù)據(jù)進行分區(qū)具體步驟 sql server系統(tǒng)表損壞的解決方法 sql server系統(tǒng)表損壞的解決方法 MS-SQL2005服務器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關系 MS-SQL2005服務器登錄名、角色、數(shù)據(jù)庫用戶、角色、架構(gòu)的關系

相關下載

    人氣排行 配置和注冊ODBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠程備份(還原)SQL2000數(shù)據(jù)庫 SQL2000數(shù)據(jù)庫遠程導入(導出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫服務端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級到2000的正確操作步驟 sql server系統(tǒng)表損壞的解決方法 淺談JSP JDBC來連接SQL Server 2005的方法