Condividi tramite


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 set ON, ROLLBACK chiude, ma non dealloca tutti i cursori aperti.

  • Con CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK non influisce su cursori o cursori sincroni STATIC INSENSITIVE aperti o cursori asincroni STATIC 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'istruzione ROLLBACK 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