[SQL] 處理造成資料庫Blocking的情形

  • 12370
  • 0
  • SQL
  • 2013-05-30

摘要:[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

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)