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. L'istruzione ROLLBACK TRANSACTION consente di cancellare tutte le modifiche dei dati eseguite dall'inizio della transazione o fino a un punto di salvataggio, nonché di liberare le risorse utilizzate dalla transazione.

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

Sintassi

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

Argomenti

  • transaction_name
    Nome assegnato alla transazione su BEGIN TRANSACTION. 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
    Valore savepoint_name da un'istruzione SAVE TRANSACTION. savepoint_name deve essere conformi 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.

Gestione degli errori

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.

Osservazioni generali

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, ROLLBACK TRANSACTION riduce il valore della funzione di sistema @@TRANCOUNT fino a 0. ROLLBACK TRANSACTION savepoint_name non riduce il valore di @@TRANCOUNT.

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 di un'istruzione COMMIT TRANSACTION, tranne quando l'istruzione COMMIT TRANSACTION viene associata a una transazione nidificata contenuta all'interno della transazione sottoposta a rollback. In tal caso, verrà eseguito il rollback anche della transazione nidificata, sebbene sia stata eseguita un'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.

Interoperabilità

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.

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 precedentemente all'errore sul batch sono soggetti alle regole 1 e 2. Un errore di deadlock è un esempio di questo tipo di errore. Questo tipo di errore inoltre viene generato automaticamente da un'istruzione ROLLBACK eseguita in un trigger.

Comportamento di blocco

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.

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';

--The following statements start a named transaction,
--insert two rows, and then roll back
--the transaction named in the variable @TransactionName.
--Another statement outside of the named transaction inserts two rows.
--The query returns the results of the previous statements.

BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1), (2);
ROLLBACK TRAN @TransactionName;

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

SELECT [value] FROM ValueTable;

DROP TABLE ValueTable;

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

Vedere anche

Riferimento

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

BEGIN TRANSACTION (Transact-SQL)

COMMIT TRANSACTION (Transact-SQL)

COMMIT WORK (Transact-SQL)

ROLLBACK WORK (Transact-SQL)

SAVE TRANSACTION (Transact-SQL)