天天看點

什麼是死鎖?——SQLProfiler跟蹤分析

作者:ET程式設計

什麼是死鎖?

死鎖是指兩個或兩個以上的程序在執行過程中,由于競争資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都将無法推進下去。此時稱系統處于死鎖狀态或系統産生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

産生死鎖的情況

案例一:

一個使用者A 通路表A(鎖住了表A),然後又通路表B

另一個使用者B 通路表B(鎖住了表B),然後企圖通路表A

  這時使用者A由于使用者B已經鎖住表B,它必須等待使用者B釋放表B,才能繼續

  同樣使用者B要等使用者A釋放表A才能繼續這就死鎖了

案例二:

使用者A讀一條紀錄,然後修改該條紀錄

  這時使用者B修改該條紀錄

  這裡使用者A的事務裡鎖的性質由共享鎖企圖上升到獨占鎖(for update),而使用者B裡的獨占鎖由于A有共享鎖存在是以必須等A釋放掉共享鎖,而A由于B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,于是出現了死鎖。

SQL Profiler

SQL Profiler是一個圖形界面和一組系統存儲過程,其作用如下:

  • 圖形化監視SQL Server查詢;
  • 在背景收集查詢資訊;
  • 分析性能;
  • 診斷像死鎖之類的問題;
  • 調試T-SQL語句;
  • 模拟重放SQL Server活動;

也可以使用SQL Profiler捕捉在SQL Server執行個體上執行的活動。這樣的活動被稱為Profiler跟蹤。

以死鎖跟蹤為例,打開死鎖跟蹤:

  • 打開工具》登入驗證
  • 進入跟蹤屬性設定
  • 正常頁簽設定跟蹤名稱
  • 使用模闆選擇TSQL-Locks
什麼是死鎖?——SQLProfiler跟蹤分析
  • 事件選擇

    保留Deadlock graph、Lock:Deaklock、Lock:Deadlock Chain

    如需分析執行時間最長的sql,保留

    BatchCompleted

    Stored Procedures-RPC:completed

  • 點選運作開始跟蹤死鎖SQL
什麼是死鎖?——SQLProfiler跟蹤分析

跟蹤完成後要及時關閉,否則會導緻滿記憶體

死鎖跟蹤分析:

  • 點選EventClass=Deadlock graph記錄,可以看到死鎖發生在哪個SQL,是什麼類型的鎖導緻死鎖
  • 左下方顯示藍色×表示為發生死鎖的SQL
  • 右邊SQL是delete語句,鎖的類型是PK_說明是行鎖,基本可以判定原因是查詢語句關聯delete影響的表沒有使用主鍵關聯,進而導緻死鎖的;
  • 根據SQL去查個案代碼或标準代碼,找出代碼邏輯做進一步分析
什麼是死鎖?——SQLProfiler跟蹤分析