KILL (Transact-SQL)

Data aggiornamento: 14 aprile 2006

Termina un processo utente in base all'ID di sessione (SPID, System Process ID, in SQL Server 2000 e nelle versioni precedenti) 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.

In Microsoft SQL Server 2000 e versioni successive è possibile utilizzare l'istruzione KILL per terminare una normale connessione, operazione che comporta internamente l'interruzione delle transazioni associate all'ID di sessione specificato. È inoltre possibile utilizzare l'istruzione per terminare tutte le transazioni distribuite orfane e in dubbio quando è in uso Microsoft Distributed Transaction Coordinator (MS DTC).

Sintassi

KILL { session ID | UOW } [ WITH STATUSONLY ] 

Argomenti

  • session ID
    ID di sessione del processo da terminare. session ID è un valore integer 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 integer 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
    Identifica l'ID dell'unità di lavoro delle transazioni distribuite. UOW è un valore GUID che è possibile ottenere dalla colonna request_owner_guid della vista a gestione dinamica sys.dm_tran_locks. È inoltre possibile ottenere il valore UOW dal log degli errori o tramite il monitor 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 consente di semplificare l'identificazione delle transazioni orfane tramite l'esecuzione di una query sulla colonna dell'ID di sessione nelle viste a gestione dinamica 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 dei valori di ID della sessione attiva, è possibile 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. È inoltre possibile 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 verrà indicato KILLED/ROLLBACK.

Quando una determinata connessione mantiene attivo un blocco su una risorsa del database e blocca l'elaborazione di un'altra connessione, l'ID di sessione della connessione bloccante 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 Utilizzo delle transazioni contrassegnate (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|UOW WITH STATUSONLY l'operazione di rollback 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:

"Messaggio 6120, livello 16, stato 1, riga 1"

"Impossibile ottenere un report sullo stato. L'operazione di rollback per l'ID di processo <ID di sessione> non è in corso."

È possibile ottenere lo stesso report di stato ripetendo la stessa istruzione KILL session ID|UOW senza utilizzare l'opzione WITH STATUSONLY. Questa procedura 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 situazioni di questo tipo.

Autorizzazioni

È richiesta l'appartenenza ai ruoli predefiniti del database sysadmin e 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 (Transact-SQL)
SHUTDOWN (Transact-SQL)
@@SPID (Transact-SQL)
sys.dm_exec_requests
sys.dm_exec_sessions
sys.dm_tran_locks
sp_lock (Transact-SQL)
sp_who (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

14 aprile 2006

Contenuto modificato:
  • Sostituzione dei riferimenti a SPID con quelli relativi all'ID di sessione