KILL (Transact-SQL)

Si applica a: SQL Server (tutte le versioni supportate) Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Termina un processo utente in base all'ID di sessione o all'unità di lavoro (UOW, Unit Of Work). Se all'ID di sessione o al valore UOW specificato sono associate numerose azioni di rollback, l'esecuzione dell'istruzione KILL può richiedere del tempo, soprattutto quando implica il rollback di una transazione lunga.

KILL termina una connessione normale, operazione che arresta internamente le transazioni associate all'ID di sessione specificato. A volte può essere in uso Microsoft Distributed Transaction Coordinator (MSDTC). In tal caso, è anche possibile usare l'istruzione per terminare le transazioni distribuite orfane e in dubbio.

Icona collegamento argomentoConvenzioni relative alla sintassi Transact-SQL

Sintassi

-- Syntax for SQL Server  
  
KILL { session ID [ WITH STATUSONLY ] | UOW [ WITH STATUSONLY | COMMIT | ROLLBACK ] }    

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
KILL 'session_id'  
[;]   

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

session ID
ID di sessione del processo da terminare. session_id è un valore intero univoco (int) assegnato a ogni connessione utente al momento dell'attivazione. Il valore dell'ID di sessione rimane associato alla connessione per tutta la durata della connessione. Al termine della connessione, il valore intero viene rilasciato ed è possibile riassegnarlo a una nuova connessione.

La query seguente consente di identificare il session_id che si intende eliminare:

SELECT conn.session_id, host_name, program_name,
    nt_domain, login_name, connect_time, last_request_end_time 
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
   ON sess.session_id = conn.session_id;

UOW
Identifica l'ID dell'unità di lavoro delle transazioni distribuite. UOW è un GUID che è possibile ottenere dalla colonna request_owner_guid della vista a gestione dinamica sys.dm_tran_locks. È anche possibile ottenere il valore UOW dal log degli errori o tramite il monitoraggio MS DTC. Per ulteriori informazioni sul monitoraggio di transazioni distribuite, vedere la documentazione di MS DTC.

Usare KILL <UOW> per arrestare le transazioni distribuite non risolte. Queste transazioni non sono associate a un ID di sessione effettivo, ma sono invece associate in modo artificiale all'ID di sessione -2. Questo ID di sessione semplifica l'identificazione delle transazioni non risolte tramite l'esecuzione di una query sulla colonna dell'ID di sessione nella vista a gestione dinamica sys.dm_tran_locks, sys.dm_exec_sessions o sys.dm_exec_requests.

WITH STATUSONLY
Viene utilizzata per generare un report di stato per un valore di UOW o session_id specificato sottoposto a rollback a causa di un’istruzione KILL precedente. L’istruzione KILL WITH STATUSONLY non termina o esegue il rollback dell’unità di lavoro o dell’ID di sessione. Il comando visualizza esclusivamente lo stato corrente del rollback.

WITH COMMIT
Viene utilizzata per terminare una transazione distribuita non risolta con commit. Applicabile solo alle transazioni distribuite, per usare questa opzione è necessario specificare un valore per UOW. Per altre informazioni, vedere Transazioni distribuite.

WITH ROLLBACK
Viene utilizzata per terminare una transazione distribuita non risolta con rollback. Applicabile solo alle transazioni distribuite, per usare questa opzione è necessario specificare un valore per UOW. Per altre informazioni, vedere Transazioni distribuite.

Osservazioni

L'istruzione KILL viene normalmente usata per terminare un processo che blocca altri processi importanti con blocchi. Può essere usata anche per arrestare un processo che sta eseguendo una query che usa risorse di sistema necessarie. I processi di sistema e i processi che eseguono una stored procedure estesa non possono essere terminati.

Eseguire l'istruzione KILL con cautela, in particolare quando sono in esecuzione processi critici. Non è possibile terminare un proprio processo. Inoltre, è consigliabile non terminare i processi seguenti:

  • AWAITING COMMAND
  • CHECKPOINT SLEEP
  • LAZY WRITER
  • LOCK MONITOR
  • SIGNAL HANDLER

Utilizzare @@SPID per visualizzare il valore dell'ID di sessione della sessione corrente.

Per ottenere un report dei valori di ID della sessione attiva, eseguire una query sulla colonna session_id delle viste a gestione dinamica sys.dm_tran_locks, sys.dm_exec_sessions e sys.dm_exec_requests. Si può anche visualizzare la colonna SPID restituita dalla stored procedure di sistema sp_who. Se è in corso il rollback per un processo SPID specifico, nella relativa colonna cmd del set di risultati sp_who viene indicato KILLED/ROLLBACK.

Quando una determinata connessione mantiene attivo un blocco su una risorsa del database e blocca l'avanzamento di un'altra connessione, l'ID di sessione della connessione di blocco viene visualizzato nella colonna blocking_session_id di sys.dm_exec_requests o nella colonna blk restituita da sp_who.

È possibile utilizzare il comando KILL per risolvere le transazioni distribuite in dubbio. Queste sono le transazioni distribuite non risolte che si verificano in seguito a riavvii non pianificati del server di database o di MS DTC. Per altre informazioni sulla creazione di transazioni contrassegnate, vedere la sezione "Commit in due fasi" in Usare transazioni contrassegnate per recuperare coerentemente i database correlati (modello di recupero con registrazione completa).

Utilizzo di WITH STATUSONLY

Il comando KILL WITH STATUSONLY genera un report solo se è in corso il rollback dell'ID di sessione o del valore UOW in seguito all'esecuzione di un'istruzione KILL session ID|UOW precedente. Il report di stato indica la percentuale di rollback completata e il periodo di tempo rimanente, espresso in secondi, nel formato seguente:

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

Se quando si esegue l'istruzione KILL session ID|UOW WITH STATUSONLY l'operazione di rollback dell'ID di sessione o del valore UOW è già stata completata, KILL session ID|UOW WITH STATUSONLY restituisce il messaggio di errore seguente:

"Msg 6120, Level 16, State 1, Line 1"  
"Status report cannot be obtained. Rollback operation for Process ID <session ID> is not in progress."

Questo errore si verifica anche se non è in corso il rollback di ID di sessione o UOW

È possibile ottenere lo stesso report di stato ripetendo la stessa istruzione KILL session ID|UOW senza usare l'opzione WITH STATUSONLY. Tuttavia, non è consigliabile ripetere l'opzione in questo modo. Se si ripete un'istruzione KILL session ID, il nuovo processo potrebbe infatti arrestarsi se dopo il completamento del rollback l'ID di sessione viene riassegnato a una nuova attività prima dell'esecuzione della nuova istruzione KILL. Impedire l'arresto del nuovo processo specificando WITH STATUSONLY.

Autorizzazioni

SQL Server: è richiesta l'autorizzazione ALTER ANY CONNECTION. L'autorizzazione ALTER ANY CONNECTION viene concessa mediante l'appartenenza al ruolo server predefinito sysadmin o processadmin.

Database SQL: è richiesta l'autorizzazione KILL DATABASE CONNECTION. L'account di accesso a livello di server principale ha l'autorizzazione KILL DATABASE CONNECTION.

Esempi

R. Uso di KILL per arrestare una sessione

L'esempio seguente illustra come arrestare l'ID di sessione 53.

KILL 53;  
GO  

B. Utilizzo di KILL session ID WITH STATUSONLY per ottenere un report di stato

Nell'esempio seguente viene generato un report di stato del processo di rollback per l'ID di sessione specifico.

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. Uso di KILL per arrestare una transazione distribuita orfana

L'esempio seguente illustra come arrestare una transazione distribuita orfana (ID di sessione = -2) con un valore UOW di D5499C66-E398-45CA-BF7E-DC9C194B48CF.

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

Vedere anche

KILL STATS JOB (Transact-SQL)
KILL QUERY NOTIFICATION SUBSCRIPTION (Transact-SQL)
Funzioni predefinite (Transact-SQL)
SHUTDOWN (Transact-SQL)
@@SPID (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sys.dm_exec_sessions (Transact-SQL)
sys.dm_tran_locks (Transact-SQL)
sp_lock (Transact-SQL)
sp_who (Transact-SQL)