什麼是死鎖?
死鎖是指兩個或兩個以上的程序在執行過程中,由于競争資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都将無法推進下去。此時稱系統處于死鎖狀态或系統産生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
産生死鎖的情況
案例一:
一個使用者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
-
事件選擇
保留Deadlock graph、Lock:Deaklock、Lock:Deadlock Chain
如需分析執行時間最長的sql,保留
BatchCompleted
Stored Procedures-RPC:completed
- 點選運作開始跟蹤死鎖SQL
跟蹤完成後要及時關閉,否則會導緻滿記憶體
死鎖跟蹤分析:
- 點選EventClass=Deadlock graph記錄,可以看到死鎖發生在哪個SQL,是什麼類型的鎖導緻死鎖
- 左下方顯示藍色×表示為發生死鎖的SQL
- 右邊SQL是delete語句,鎖的類型是PK_說明是行鎖,基本可以判定原因是查詢語句關聯delete影響的表沒有使用主鍵關聯,進而導緻死鎖的;
- 根據SQL去查個案代碼或标準代碼,找出代碼邏輯做進一步分析