ROLLBACK TRANSACTION (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in Microsoft Fabric

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.

Non sono incluse le modifiche apportate alle variabili locali o alle variabili tabella, che non vengono cancellate a questa istruzione.

Convenzioni di sintassi Transact-SQL

Sintassi

--Applies to SQL Server and Azure SQL Database

ROLLBACK { TRAN | TRANSACTION }   
     [ transaction_name | @tran_name_variable  
     | savepoint_name | @savepoint_variable ]   
[ ; ]  
-- Applies to Synpase Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse Database
  
ROLLBACK { TRAN | TRANSACTION } 
[ ; ]  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

transaction_name
Nome assegnato alla transazione su BEGIN TRANSACTION. transaction_name deve essere conforme alle regole per gli identificatori, ma vengono usati solo i primi 32 caratteri del nome della transazione. Quando le transazioni sono annidate, transaction_name deve essere il nome dell'istruzione BEGIN TRANSACTION più esterna. In transaction_name viene sempre applicata la distinzione tra maiuscole e minuscole, anche quando l'istanza di SQL Server non la prevede.

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

savepoint_name
savepoint_name di un'istruzione SAVE TRANSACTION. savepoint_name deve essere conforme alle regole per gli identificatori. Usare savepoint_name quando un rollback condizionale deve interessare solo parte della transazione.

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

Gestione 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 un argomento savepoint_name o 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 decrementa la funzione di sistema @@TRANCOUNT su 0. ROLLBACK TRANSACTION savepoint_name non decrementa @@TRANCOUNT.

L'istruzione ROLLBACK TRANSACTION non può fare riferimento a un savepoint_name in transazioni distribuite avviate in modo esplicito con l'istruzione BEGIN DISTRIBUTED TRANSACTION o risultanti dall'escalation di 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 questo caso, il rollback della transazione annidata viene eseguito anche se per la transazione è 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 un argomento savepoint_name o transaction_name eseguono il rollback di tutte le istruzioni fino all'istruzione BEGIN TRANSACTION più esterna. Un'istruzione ROLLBACK TRANSACTION in una stored procedure che fa sì che @@TRANCOUNT abbia un valore diverso quando la stored procedure viene completata rispetto al valore @@TRANCOUNT quando la stored procedure è stata chiamata genera 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.

@@TRANCOUNT viene incrementato di uno quando si immette un 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. Dopo aver creato una tabella, le istruzioni seguenti determinano l'avvio di una transazione denominata, l'inserimento di due righe e quindi il rollback della transazione denominata nella variabile @TransactionName. Un'altra istruzione all'esterno della transazione denominata inserisce due righe. La query restituisce i risultati delle istruzioni precedenti.

USE tempdb;  
GO  
CREATE TABLE ValueTable ([value] INT);  
GO  
  
DECLARE @TransactionName VARCHAR(20) = 'Transaction1';  
  
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;  

Questo è il set di risultati.

value  
-----   
3    
4  

Vedi anche

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)