搜尋本站文章

2007-12-31

找出被封鎖的連線; blocked lock connectoin


有朋友在詢問,如何找出來因為封鎖(Blocked Lock)造成的等待時間、被封鎖的連線等等之相關資訊。

其實方法有很多,建議您可以參考以下的動態管理檢視:
sys.dm_exec_requests


範例如下:
SELECT session_id N'工作階段識別碼',status N'要求的狀態',
command N'目前所處理命令的類型',blocking_session_id N'封鎖要求之工作階段的識別碼' ,
wait_type N'被封鎖的等候類型',wait_time N'等候的持續時間',
wait_resource N'目前等候的資源',transaction_id N'要求執行所在交易的識別碼'
FROM sys.dm_exec_requests
ORDER BY 1 DESC



請參考下圖的顯示結果:



什麼是鎖定(Lock)?
每一個交易會要求資源上不同類型的鎖定,例如交易相依的資料列、頁面或資料表。鎖定會阻擋其他交易修改資源,以免造成要求鎖定的交易發生問題。每一個交易對於鎖定的資源不再具有相依性時,就會釋放它的鎖定。

什麼是資料列版本控制(Row Versioning)

啟用以資料列版本控制為基礎的隔離等級之後,「Database Engine」會維護每一個修改過的資料列的版本。應用程式可指定交易使用資料列版本,來檢視交易或查詢開始時已存在的資料,而不是以鎖定來保護所有讀取。透過使用資料列版本控制,讀取作業封鎖其他交易的機會可大幅降低。

鎖定和資料列版本控制可防止使用者讀取尚未認可的資料,以及防止多個使用者同時變更同一筆資料。若未使用鎖定或資料列版本控制,則對資料執行查詢時,可能會傳回尚未在資料庫中認可的資料,因而產生非預期的結果。

什麼是封鎖(Blocked Lock)?
當系統無法將鎖定授予某個資源上的交易,因為會與該資源上另一交易的鎖定發生衝突,此時,要求鎖定的交易會被封鎖,直到擁有鎖定的交易釋放鎖定為止。

如果 Microsoft SQL Server Database Engine 的執行個體因為另一個交易已擁有資源的衝突鎖定,而無法將鎖定授與給另一個交易時,第一個交易會被封鎖,並等待現有鎖定釋出。
依預設,除非嘗試存取資料 (且可能會永遠被封鎖),否則並沒有強制的逾時期限,且無法在鎖定資源之前測試資源是否已經鎖定。