ROLLBACK TRANSACTION (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Analytics Platform System (PDW) Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Questa istruzione esegue il rollback di una transazione esplicita o implicita all'inizio della transazione o a un punto di salvataggio all'interno della transazione. È possibile utilizzare ROLLBACK TRANSACTION
per cancellare tutte le modifiche apportate ai dati dall'inizio della transazione o in un punto di salvataggio. nonché di liberare le risorse utilizzate dalla transazione.
Il rollback di una transazione non include modifiche apportate alle variabili locali o alle variabili di tabella. Queste modifiche non vengono cancellate da questa istruzione.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
Sintassi per SQL Server e database SQL di Azure.
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Sintassi per Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics e Parallel Data Warehouse Database.
ROLLBACK { TRAN | TRANSACTION }
[ ; ]
Argomenti
transaction_name
Nome assegnato alla transazione in 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 si annidano le transazioni, transaction_name deve essere il nome dell'istruzione più esterna BEGIN TRANSACTION
. transaction_name fa sempre distinzione tra maiuscole e minuscole, anche quando l'istanza di SQL Server non fa distinzione tra maiuscole e minuscole.
@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 da 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 nome di punto di salvataggio valido. La variabile deve essere dichiarata con un tipo di dati char, varchar, nchar o nvarchar.
Gestione degli errori
Un'istruzione ROLLBACK TRANSACTION
non produce messaggi all'utente. Se sono necessari avvisi in stored procedure o trigger, usare le RAISERROR
istruzioni o PRINT
. RAISERROR
è l'istruzione preferita per indicare gli errori.
Osservazioni:
ROLLBACK TRANSACTION
senza un savepoint_name o transaction_name esegue il rollback all'inizio della transazione. Quando si annidano transazioni, questa stessa istruzione esegue il rollback di tutte le transazioni interne all'istruzione più esterna BEGIN TRANSACTION
. In entrambi i casi, ROLLBACK TRANSACTION
decrementa la funzione di @@TRANCOUNT
sistema su 0. ROLLBACK TRANSACTION <savepoint_name>
non decrementa @@TRANCOUNT
.
ROLLBACK TRANSACTION
non può fare riferimento a un savepoint_name nelle transazioni distribuite avviate in modo esplicito con BEGIN DISTRIBUTED TRANSACTION
o inoltrate da una transazione locale.
Non è possibile eseguire il rollback di una transazione dopo l'esecuzione di un'istruzione COMMIT TRANSACTION
, tranne quando l'oggetto COMMIT TRANSACTION
è associato a una transazione nidificata contenuta all'interno della transazione di cui viene eseguito il rollback. In questo caso, viene eseguito il rollback della transazione nidificata, anche se è stato emesso un oggetto COMMIT TRANSACTION
per tale transazione.
All'interno di una transazione sono consentiti nomi di punti di salvataggio duplicati, ma un ROLLBACK TRANSACTION
oggetto che utilizza il nome del punto di salvataggio duplicato esegue il rollback solo all'ultimo SAVE TRANSACTION
utilizzo del nome del punto di salvataggio.
Interoperabilità
Nelle stored procedure ROLLBACK TRANSACTION
, le istruzioni senza un savepoint_name o transaction_name eseguire il rollback di tutte le istruzioni all'oggetto più esterno BEGIN TRANSACTION
. Un'istruzione ROLLBACK TRANSACTION
in una stored procedure che determina @@TRANCOUNT
un valore diverso quando la stored procedure viene completata rispetto al @@TRANCOUNT
valore quando la stored procedure è stata chiamata produce un messaggio informativo. Questo messaggio non influisce sull'elaborazione successiva.
Se un ROLLBACK TRANSACTION
viene emesso 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 a eseguire eventuali istruzioni rimanenti dopo l'istruzione
ROLLBACK
. Se una di queste istruzioni modifica i dati, non viene eseguito il rollback delle modifiche eseguite. L'esecuzione delle istruzioni rimanenti non attiva trigger nidificati.Le istruzioni nel batch dopo l'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.
ROLLBACK TRANSACTION
le istruzioni nelle stored procedure non influiscono sulle istruzioni successive nel batch che ha chiamato la routine; vengono eseguite istruzioni successive nel batch. ROLLBACK TRANSACTION
le istruzioni nei trigger terminano il batch contenente l'istruzione che ha attivato il trigger; le istruzioni successive nel batch non vengono eseguite.
L'effetto di un ROLLBACK
oggetto sui cursori è definito da queste tre regole:
Con
CURSOR_CLOSE_ON_COMMIT
setON
,ROLLBACK
chiude, ma non dealloca tutti i cursori aperti.Con
CURSOR_CLOSE_ON_COMMIT
setOFF
,ROLLBACK
non influisce su cursori o cursori sincroniSTATIC
INSENSITIVE
aperti o cursori asincroniSTATIC
completamente popolati. I cursori aperti di qualsiasi altro tipo vengono chiusi, ma non deallocati.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. Tutti i cursori vengono deallocati 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 sono soggetti alle prime due regole. Un errore di deadlock è un esempio di questo tipo di errore. Un'istruzioneROLLBACK
rilasciata in un trigger genera automaticamente anche questo tipo di errore.
Comportamento di blocco
Un'istruzione ROLLBACK TRANSACTION
che specifica un savepoint_name rilascia tutti i blocchi acquisiti oltre il punto di salvataggio, ad eccezione delle escalation e delle conversioni. Questi blocchi non vengono rilasciati e non vengono convertiti di nuovo nella modalità di blocco precedente.
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 avviano una transazione denominata, inseriscono due righe e quindi esegue 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 TRANSACTION @TransactionName
INSERT INTO ValueTable
VALUES (1), (2);
ROLLBACK TRANSACTION @TransactionName;
INSERT INTO ValueTable
VALUES (3), (4);
SELECT [value]
FROM ValueTable;
DROP TABLE ValueTable;
Il set di risultati è il seguente.
value
-----
3
4