摘要:[SQL] 處理造成資料庫Blocking的情形
前言
有碰到blocking問題~順便記錄一下,因為不當的操作資料庫使的資料庫造成Blocking的問題應該要如何處理呢? 讓我們看下去。
範例
首先我們可以使用SQL SERVER提供的系統預存程序 sp_who
而針對 sp_who 的使用 MSDN 中提到:
提供 Microsoft SQL Server Database Engine 執行個體中有關目前使用者、工作階段和處理序的資訊。 您可以篩選資訊,只傳回屬於特定使用者或屬於特定工作階段的非閒置處理序
也就是說可以透過 sp_who 回傳的資訊觀察連線資訊,sp_who 還有分 sp_who, sp_who2 幾種,回傳的資訊略有差異,而回傳的SPID數值50以下的為系統進程,可以先忽略掉。
接下來就來就用 BEGIN TRAN 模擬Blocking狀態發生,開啟一個查詢視窗,執行第一段SQL陳述
BEGIN TRAN
UPDATE dbo.UserInfo SET Name = 'TEST' WHERE Id=44
--COMMIT // 先不COMMIT
再開啟另一個查詢視窗,執行第二段SQL陳述:
UPDATE dbo.UserInfo SET Name = 'TEST_2' WHERE Id=45
這邊可以看到第一段SQL有使用交易機制,在未Commit的情況下Table使用會被這個連線佔據,當第二段SQL執行時就必須等待第一段SQL執行Commit後才能工作。
此時我使用 sp_who2 查詢資料庫進程資訊後,可以發現SPID 53的連線 BlkBy 欄位顯示55,也就是SPID 53因為SPID 55工作未執行完成而被阻擋住了
由此如果我們需要知道SPID 55是在做什麼?SQL語句為何?的時候可以用 DBCC INPUTBUFFER 陳述式查看,DBCC INPUTBUFFER 可以查看該SPID的SQL語句是什麼,具體使用方式就是 DBCC INPUTBUFFER (SPID)
找到了影響資料庫Blocking的原因連線後,就可以使用 KILL (SPID) 將此連線中斷掉即可,另外也可以使用 sp_lock 查看被鎖定的情形。
參考資料
http://technet.microsoft.com/zh-tw/library/ms174313.aspx
http://technet.microsoft.com/zh-tw/library/ms187730.aspx
http://technet.microsoft.com/zh-tw/library/ms173730.aspx
http://technet.microsoft.com/zh-tw/library/ms187749.aspx
http://support.microsoft.com/kb/264689/zh-tw
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)