Share via


KILL (Transact-SQL)

根據工作階段識別碼 (SQL Server 2000 或更早版本中的 SPID ) 或工作單位 (UOW) 來結束使用者處理序。如果指定的工作階段識別碼或 UOW 有許多工作要恢復,KILL 陳述式可能需要花一些時間來完成,特別是當它牽涉到回復較長的交易時。

在 SQL Server 2000 與更新版本中,KILL 可用於結束正常的連接,這樣就可在內部結束與指定之工作階段識別碼關聯的交易。當 Microsoft 分散式交易協調器 (MS DTC) 在使用中時,此陳述式也可用以結束被遺棄和不確定的分散式交易。

主題連結圖示Transact-SQL 語法慣例

語法

KILL { session ID | UOW } [ WITH STATUSONLY ] 

引數

  • session ID
    是要結束之處理序的工作階段識別碼。session ID 是在建立連接時,指派給每個使用者連接的唯一整數 (int)。在連接持續時間,工作階段識別碼值會繫結連接。當連接結束時,會釋出這個整數值,它可以重新指派給新的連接。

    請利用 KILL session ID 來結束與指定工作階段識別碼關聯的一般非分散式和分散式交易。

  • UOW
    識別分散式交易的工作單位識別碼 (UOW)。UOW 是可從 sys.dm_tran_locks 動態管理檢視的 request_owner_guid 資料行取得的 GUID。您也可以從錯誤記錄檔或透過 MS DTC 監視器來取得 UOW。如需有關監視分散式交易的詳細資訊,請參閱 MS DTC 文件集。

    利用 KILL UOW 來結束被遺棄的分散式交易。這些交易並未與任何真正的工作階段識別碼關聯,相反地,它們是人工地關聯於 session ID = '-2'。透過查詢 sys.dm_tran_locks、sys.dm_exec_sessions 或 sys.dm_exec_requests 動態管理檢視中的 session ID 資料行,此工作階段識別碼使得識別被遺棄的交易變得更容易。

  • WITH STATUSONLY
    針對先前的 KILL 陳述式而回復的指定 session ID 或 UOW,產生一份進度報告。KILL WITH STATUSONLY 並不會結束或回復 session ID 或 UOW,此命令只會顯示目前的回復進度。

備註

KILL 通常用來結束利用鎖定來封鎖其他重要處理序的處理序,或所執行的查詢在使用必要系統資源的處理序。系統處理序和執行擴充預存程序的處理序無法結束。

使用 KILL 時,要非常小心,當執行重要處理序時,尤其如此。您無法清除自己的處理序。其他不應清除的處理序如下:

  • AWAITING COMMAND

  • CHECKPOINT SLEEP

  • LAZY WRITER

  • LOCK MONITOR

  • SIGNAL HANDLER

請利用 @@SPID 來顯示目前工作階段的工作階段識別碼值。

若要取得使用中工作階段識別碼值的報告,您可以查詢 sys.dm_tran_locks、sys.dm_exec_sessions 以及 sys.dm_exec_requests 動態管理檢視中的 session_id 資料行。您也可以檢視由 sp_who 系統預存程序傳回的 SPID 資料行。如果特定 SPID 的回復正在進行中,sp_who 結果集中該 SPID 的 cmd 資料行會指出 KILLED/ROLLBACK。

當特定連接對資料庫資源有鎖定並封鎖另一個連接的進度時,封鎖連接的工作階段識別碼會出現在 sys.dm_exec_requests 的 blocking_session_id 資料行或是由 sp_who 傳回的 blk 資料行中。

KILL 命令可用來解決不確定的分散式交易。這些交易是未解決的分散式交易,之所以會發生是因為資料庫伺服器或 MS DTC 協調器發生了非計畫的重新啟動。如需有關不確定交易的詳細資訊,請參閱<使用標示的交易 (完整復原模式)>中的「兩階段認可」一節。

使用 WITH STATUSONLY

只有因先前的 KILL session ID|UOW 陳述式使得工作階段識別碼或 UOW 正在回復中時,KILL WITH STATUSONLY 才會產生報表。進度報告會指出已完成的回復量 (百分比) 及估計的剩下時間長度 (以秒為單位),格式如下:

Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: <yy>% Estimated time left: <zz> seconds

如果執行 KILL session ID|UOW WITH STATUSONLY 陳述式時,工作階段識別碼或 UOW 的回復已經完成,或沒有回復中的作業階段識別碼或 UOW,KILL session ID|UOW WITH STATUSONLY 便會傳回下列錯誤:

「訊息 6120,層級 16,狀態 1,行 1」

「無法取得狀態報告。處理序識別碼 <session ID> 的回復作業尚未進行。」

您可以重複不含 WITH STATUSONLY 選項的相同 KILL session ID|UOW 陳述式來取得相同的狀態報告,但不建議您這麼做。如果回復已完成,且在執行新的 KILL 陳述式之前,已將工作階段識別碼重新指派給新的工作,重複 KILL session ID 陳述式可能會結束新的處理序。指定 WITH STATUSONLY 會防止發生這個情況。

權限

需要 ALTER ANY CONNECTION 權限。ALTER ANY CONNECTION 隨附在系統管理員 (sysadmin) 或處理序管理員 (processadmin) 固定伺服器角色的成員資格中。

範例

A. 使用 KILL 來結束工作階段

下列範例顯示如何結束工作階段識別碼 53。

KILL 53;
GO

B. 使用 KILL 工作階段識別碼 WITH STATUSONLY 來取得進度報告

下列範例會產生特定工作階段識別碼的回復處理序狀態。

KILL 54;
KILL 54 WITH STATUSONLY;
GO

--This is the progress report.
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.

C. 利用 KILL 來結束被遺棄的分散式交易

下列範例顯示如何結束 UOW 為 D5499C66-E398-45CA-BF7E-DC9C194B48CF 的被遺棄分散式交易 (session ID = -2)。

KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF';