Condividi tramite


KILL (Transact-SQL)

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 potrebbe richiedere tempi lunghi, soprattutto quando implica il rollback di una transazione lunga.

È possibile utilizzare KILL per terminare una connessione normale, operazione che determina internamente la fine delle transazioni associate all'ID di sessione specificato. Questa istruzione può inoltre essere utilizzata per terminare transazioni distribuite orfane e in dubbio quando Microsoft Distributed Transaction Coordinator (MS DTC) è in uso.

Si applica a: SQL Server (da SQL Server 2008 alla versione corrente), Database SQL di Windows Azure (dalla versione iniziale alla versione corrente).

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

KILL { session ID | UOW } [ WITH STATUSONLY ] 

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.

    Eseguire KILL session ID per terminare normali transazioni distribuite e non distribuite associate a un ID di sessione specificato.

  • UOW

    Si applica a: da SQL Server 2008 a SQL Server 2014.

    Identifica l'ID dell'unità di lavoro delle transazioni distribuite. UOW è un GUID che è possibile ottenere dalla colonna request_owner_guid della DMV sys.dm_tran_locks. È inoltre 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.

    Utilizzare KILL UOW per terminare le transazioni distribuite orfane. 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 orfane tramite l'esecuzione di una query sulla colonna dell'ID di sessione nella DMV sys.dm_tran_locks, sys.dm_exec_sessions o sys.dm_exec_requests.

  • WITH STATUSONLY
    Genera un report di stato su un valore session ID o UOW specificato di cui è in corso il rollback a causa di un'istruzione KILL precedente. Il comando KILL WITH STATUSONLY non termina il processo session ID o UOW o ne esegue il rollback, ma visualizza esclusivamente lo stato corrente del rollback.

Osservazioni

L'istruzione KILL viene comunemente utilizzata per terminare un processo che blocca altri processi importanti con blocchi oppure un processo che esegue una query in cui sono utilizzate risorse di sistema che è necessario liberare. 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 ed è 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 di valori di ID della sessione attiva, è possibile eseguire una query sulla colonna session_id delle DMV sys.dm_tran_locks, sys.dm_exec_sessions e sys.dm_exec_requests. È inoltre possibile visualizzare la colonna SPID restituita dalla stored procedure di sistema sp_who. Se è in corso il rollback per uno SPID specifico, nella colonna cmd del set di risultati sp_who verrà 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 ulteriori informazioni sulle transazioni in dubbio, vedere la sezione relativa al commit in due fasi in Utilizzare 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. Nel report di stato è indicata 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 WITH STATUSONLY l'operazione di rollback|UOW dell'ID di sessione o del valore UOW è già stata completata oppure non è in corso il rollback di tale processo, KILL session ID|UOW WITH STATUSONLY restituirà 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."

È possibile ottenere lo stesso report di stato ripetendo la stessa istruzione KILL session ID|Istruzione UOW senza utilizzare l'opzione WITH STATUSONLY. Questa operazione non è tuttavia consigliabile. La ripetizione di un'istruzione KILL session ID potrebbe infatti terminare un nuovo processo se dopo il completamento del rollback l'ID di sessione viene riassegnato a una nuova attività prima dell'esecuzione della nuova istruzione KILL. L'utilizzo della clausola WITH STATUSONLY consente di evitare questo tipo di problema.

Autorizzazioni

È richiesta l'autorizzazione ALTER ANY CONNECTION. L'autorizzazione ALTER ANY CONNECTION viene concessa tramite l'appartenenza al ruolo predefinito del server sysadmin o processadmin.

Esempi

A.Utilizzo di KILL per terminare una sessione

Nell'esempio seguente viene illustrato come terminare 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.Utilizzo di KILL per terminare una transazione distribuita orfana

Nell'esempio seguente viene illustrato come terminare 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

Riferimento

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)