一、 問題
當執行SQL指令產生1205的ERROR時,我要如何協助AP找到產生deadlock的SQL指令?
二、 解決方案
使用SQL
Profiler錄製,當死結發生時,SQL Profiler會提供Deadlock Graph提供Deadlock相關資訊。
三、 執行
1.
建立測試資料
建立兩個資料表DATA01與DATA02並產生測試資料。
2.
模擬死結發生
在SESSION1建立一筆交易,先更新DATA01資料表後的
15秒後才更新DATA02的資料表。
在SESSION2建立一筆交易,先更新DATA02資料表後的
15秒後才更新DATA01的資料表。
3.
使用SQL PROFILER錄製死結。
點選Locks的Deadlock Graph等事件。
最後死結發生,SESSION2被當作此次的犧牲者。
此時SQL PROFILERT偵測到死結產生Deadlock Graph
4.
解讀Deadlock Graph內容
檢視Deadlock Graph做邊藍色打X的部分是被犧牲的SESSION,中間長方形的是被鎖定的Resource,可能是資料表、PAGE或是單一資料列,而左右箭頭代表Resource被取得(Hold)與要求(Request)。
將Deadlock Graph使用XML的格式打開
可以看到更詳細的資訊,其中最下方的inputbuf代表與死結有關的SQL指令,而deadlock victim代表被犧牲的SESSION,有時候如果SQL指令太長(例如STORED
PROCEDURE)可以使用sqlhandle加上sys.dm_exec_sql_text產出完整的SQL語法。
小結:
當死結發生時可用SQL PROFILER去錄製死結,產生出來的Deadlock Graph可透過圖形或XML的格式取得產生死結的原因,通常inputbuf會顯示產生死結的SQL指令,如果SQL指令太長可以使用sys.dm_exec_sql_text找出完整的SQL指令。
沒有留言:
張貼留言