當資料表資料發生Blocking時,我們第一時間往往就是檢查是哪一個Session鎖住資料
導致發生Blocking,但該如何查詢是哪一筆資料被鎖住呢 ?
下圖中我建立了一張資料表tbLock並新增兩筆資料後,我開啟交易去Update id 等於1的那一筆資料(不Commit),SQL會在該筆資料放一個X鎖定。
此時我再開另一個Session(圖中Session id是67)去查tbLock資料表id等於1的那一筆資料,由於剛剛Session交易尚未結束因此會造成Blocking。由下圖紅色圈選處可以看見該查詢處於等待狀態。
透過sp_lock可以看見spid為67的有一筆交易狀態是WAIT,他在等待放一個S鎖定在Resource是(8194443284a0)的這一筆資料。而這一筆(8194443284a0)目前被spid為65的放了一個X鎖定,而我們無法從這些內容看出到底是哪一筆資料被鎖住了。下面介紹兩種方法來查出(8194443284a0)到底是tbLock資料表中的哪一筆資料呢。
方法一 : 如下圖所示,我們直接看資料頁面,由上圖中我們可以知道該筆資料在位於DBID=12 ,FileID=1,PageID=576 的頁面。因此我們可以用DBCC PAGE來查看該頁面內容,注意需先執行DBCC TRACEON(3604)才能讓內容顯示在訊息中歐。如下圖紅色圈選處我們看到一行KeyHashValue = (8194443284a0)的文字,而該行文字上方則為該筆資料的內容(如藍色圈選處),我們可以看見id欄位為1而name這個欄位內容是Ben。
方法二 : 上一個方法可讀性較低,要在茫茫文字海中找出那一筆資料有點麻煩。方法二則較簡單,如下圖所示我們只要搜尋該資料表中%%LOCKRES%% = '(8194443284a0)',SQL就會回傳該筆資料給我們囉 ( 注意 ! 由於目前該筆資料還在鎖定狀態,用這一種方式查尋記得要加上 With(NOLOCK) 歐 )。
我是ROCK
rockchang@mails.fju.edu.tw