Condividi tramite


ROLLBACK TRANSACTION (Transact-SQL)

Esegue il rollback di una transazione implicita o esplicita fino all'inizio della transazione o fino a un punto di salvataggio.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

ROLLBACK { TRAN | TRANSACTION } 
     [ transaction_name | @tran_name_variable
     | savepoint_name | @savepoint_variable ] 
[ ; ]

Argomenti

  • transaction_name
    Nome assegnato alla transazione nell'istruzione BEGIN TRANSACTION. L'argomento transaction_name deve essere conforme alle regole per gli identificatori, ma vengono utilizzati solo i primi 32 caratteri del nome della transazione. Quando le transazioni sono nidificate, transaction_name deve essere il nome dell'istruzione BEGIN TRANSACTION più esterna.

  • **@**tran_name_variable
    Nome di una variabile definita dall'utente contenente un nome di transazione valido. La variabile deve essere dichiarata con il tipo di dati char, varchar, nchar o nvarchar.

  • savepoint_name
    Indica il nome del punto di salvataggio specificato in savepoint_name di un'istruzione SAVE TRANSACTION. L'argomento savepoint_name deve essere conforme alle regole per gli identificatori. Utilizzare l'argomento savepoint_name quando si desidera eseguire un rollback condizionale solo per una parte della transazione.

  • **@**savepoint_variable
    Nome di una variabile definita dall'utente contenente un punto di salvataggio valido. La variabile deve essere dichiarata con il tipo di dati char, varchar, nchar o nvarchar.

Osservazioni

L'istruzione ROLLBACK TRANSACTION cancella tutte le modifiche dei dati eseguite dall'inizio della transazione o fino a un punto di salvataggio, nonché libera le risorse utilizzate dalla transazione.

L'istruzione ROLLBACK TRANSACTION senza gli argomenti savepoint_name e transaction_name esegue il rollback fino all'inizio della transazione. Quando le transazioni sono nidificate, viene eseguito il rollback di tutte le transazioni interne all'istruzione BEGIN TRANSACTION più esterna. In entrambi i casi, l'istruzione ROLLBACK TRANSACTION riduce il valore della funzione di sistema @@TRANCOUNT fino a 0, a meno che non sia stato specificato l'argomento savepoint_name.

Un'istruzione ROLLBACK TRANSACTION che specifica un argomento savepoint_name rilascia tutti i blocchi acquisiti oltre il punto di salvataggio, ad eccezione di escalation e conversioni. Tali blocchi non vengono rilasciati né riconvertiti alla loro precedente modalità di blocco.

L'istruzione non può fare riferimento al punto di salvataggio (specificato da savepoint_name) delle transazioni distribuite iniziate in modo esplicito con BEGIN DISTRIBUTED TRANSACTION o innalzate di livello da una transazione locale.

Non è possibile eseguire il rollback di una transazione dopo l'esecuzione dell'istruzione COMMIT TRANSACTION.

In una transazione sono consentiti nomi di punti di salvataggio duplicati. In tal caso il rollback viene tuttavia eseguito solo fino all'istruzione SAVE TRANSACTION più recente che utilizza il punto di salvataggio.

Nelle stored procedure le istruzioni ROLLBACK TRANSACTION senza gli argomenti savepoint_name e transaction_name eseguono il rollback di tutte le istruzioni fino all'istruzione BEGIN TRANSACTION più esterna. Se con un'istruzione ROLLBACK TRANSACTION in una stored procedure si ottiene dopo il completamento della stored procedure un valore @@TRANCOUNT diverso rispetto al valore al momento della chiamata della stored procedure, viene visualizzato un messaggio informativo. Tale messaggio non ha alcun effetto sulle elaborazioni successive.

Se viene eseguita un'istruzione ROLLBACK TRANSACTION in un trigger:

  • Viene eseguito il rollback di tutte le modifiche dei dati apportate fino a quel punto nella transazione corrente, comprese le modifiche apportate dal trigger.

  • Il trigger continua l'esecuzione delle istruzioni successive all'istruzione ROLLBACK. Se tali istruzioni modificano i dati, non viene eseguito il rollback delle modifiche eseguite. L'esecuzione delle istruzioni rimanenti non attiva trigger nidificati.

  • Le istruzioni del batch successive all'istruzione che ha attivato il trigger non vengono eseguite.

Il valore di @@TRANCOUNT viene aumentato di una unità in corrispondenza dell'attivazione del trigger, anche in modalità autocommit. Il sistema considera il trigger come transazione nidificata implicita.

Le istruzioni ROLLBACK TRANSACTION nelle stored procedure non hanno alcun effetto sulle istruzioni successive del batch che hanno richiamato la procedura. Tali istruzioni pertanto vengono eseguite. Le istruzioni ROLLBACK TRANSACTION nei trigger comportano l'interruzione del batch contenente l'istruzione che ha attivato il trigger. Le successive istruzioni del batch pertanto non vengono eseguite.

Un'istruzione ROLLBACK TRANSACTION non genera messaggi per l'utente. Se nelle stored procedure o nei trigger è necessario visualizzare avvisi, utilizzare l'istruzione RAISERROR o PRINT. RAISERROR è l'istruzione consigliata per la segnalazione di errori.

L'effetto di ROLLBACK sui cursori viene definito dalle tre regole seguenti:

  1. Se CURSOR_CLOSE_ON_COMMIT è impostato su ON, i cursori aperti vengono chiusi, ma non deallocati.

  2. Se CURSOR_CLOSE_ON_COMMIT è impostato su OFF, l'istruzione non ha alcun effetto sui cursori STATIC o INSENSITIVE sincroni aperti o sui cursori STATIC asincroni completamente popolati. I cursori aperti di qualsiasi altro tipo vengono chiusi, ma non deallocati.

  3. In seguito a un errore che comporta l'interruzione di un batch e l'esecuzione di un rollback interno, vengono deallocati tutti i cursori dichiarati nel batch contenente l'istruzione di errore. Vengono deallocati tutti i cursori indipendentemente dal tipo o dall'impostazione di CURSOR_CLOSE_ON_COMMIT, tra cui i cursori dichiarati in stored procedure richiamate dal batch di errore. I cursori dichiarati in un batch prima del batch di errore seguono le regole 1 e 2. Un esempio di questo tipo di errore è l'errore di deadlock. Questo tipo di errore inoltre viene generato automaticamente da un'istruzione ROLLBACK eseguita in un trigger.

Per un esempio di codice che illustra l'istruzione ROLLBACK TRANSACTION, vedere Nidificazione delle transazioni.

Autorizzazioni

È richiesta l'appartenenza al ruolo public.

Esempi

Nell'esempio seguente viene illustrato l'effetto dell'esecuzione del rollback di una transazione denominata.

USE TempDB;
GO

CREATE TABLE ValueTable ([value] int)
GO

DECLARE @TransactionName varchar(20) = 'Transaction1';

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

INSERT INTO ValueTable VALUES(3)
INSERT INTO ValueTable VALUES(4)

SELECT * FROM ValueTable

DROP TABLE ValueTable

--Results
--value
-------------
--3
--4