ROLLBACK TRANSACTION (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Almacenamiento en Microsoft Fabric

Esta instrucción revierte una transacción explícita o implícita al principio de la transacción, o a un punto de guardado dentro de la transacción. Puede usar ROLLBACK TRANSACTION para borrar todas las modificaciones de datos realizadas desde el inicio de la transacción o hasta un punto de guardado. También libera los recursos que mantiene la transacción.

Revertir una transacción no incluye cambios realizados en variables locales ni variables de tabla. Esta instrucción no borra estos cambios.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis para SQL Server y Azure SQL Database.

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

Sintaxis para Synapse Data Warehouse en Microsoft Fabric, Azure Synapse Analytics y base de datos de almacenamiento de datos paralelos.

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

transaction_name

Nombre asignado a la transacción en BEGIN TRANSACTION. transaction_name debe cumplir las reglas de los identificadores, aunque solo se usan los 32 primeros caracteres del nombre de la transacción. Al anidar transacciones, transaction_name debe ser el nombre de la instrucción más BEGIN TRANSACTION externa. transaction_name siempre distingue mayúsculas de minúsculas, incluso cuando la instancia de SQL Server no distingue mayúsculas de minúsculas.

@tran_name_variable

Nombre de una variable definida por el usuario que contiene un nombre de transacción válido. La variable debe declararse con un tipo de datos char, varchar, nchar o nvarchar.

savepoint_name

savepoint_name de una SAVE TRANSACTION instrucción . savepoint_name debe cumplir las reglas de los identificadores. Use savepoint_name cuando una operación de reversión condicional solo deba afectar a parte de la transacción.

@savepoint_variable

Nombre de una variable definida por el usuario que contiene un nombre de punto de guardado válido. La variable debe declararse con un tipo de datos char, varchar, nchar o nvarchar.

Control de errores

Una ROLLBACK TRANSACTION instrucción no genera ningún mensaje al usuario. Si se necesitan advertencias en procedimientos almacenados o desencadenadores, use las RAISERROR instrucciones o PRINT . RAISERROR es la instrucción preferida para indicar errores.

Comentarios

ROLLBACK TRANSACTION sin un savepoint_name o transaction_name revierte al principio de la transacción. Al anidar transacciones, esta misma instrucción revierte todas las transacciones internas a la instrucción más BEGIN TRANSACTION externa. En ambos casos, ROLLBACK TRANSACTION disminuye la función del @@TRANCOUNT sistema en 0. ROLLBACK TRANSACTION <savepoint_name> no disminuye @@TRANCOUNT.

ROLLBACK TRANSACTION no puede hacer referencia a un savepoint_name en transacciones distribuidas iniciadas explícitamente con BEGIN DISTRIBUTED TRANSACTION o escaladas desde una transacción local.

Una transacción no se puede revertir después de ejecutar una COMMIT TRANSACTION instrucción, excepto cuando COMMIT TRANSACTION está asociada a una transacción anidada contenida dentro de la transacción que se está reviertiendo. En este caso, la transacción anidada se revierte, incluso si emitió un COMMIT TRANSACTION para ella.

Dentro de una transacción, se permiten nombres de puntos de guardado duplicados, pero un ROLLBACK TRANSACTION uso del nombre de punto de guardado duplicado solo se revierte al más reciente SAVE TRANSACTION mediante ese nombre de punto de guardado.

Interoperabilidad

En los procedimientos almacenados, ROLLBACK TRANSACTION las instrucciones sin un savepoint_name o transaction_name revierten todas las instrucciones en el exterior más BEGIN TRANSACTIONexterno. Una ROLLBACK TRANSACTION instrucción de un procedimiento almacenado que hace @@TRANCOUNT que tenga un valor diferente cuando se completa el procedimiento almacenado que el @@TRANCOUNT valor cuando se llamó al procedimiento almacenado genera un mensaje informativo. Este mensaje no afecta al procesamiento posterior.

Si se emite un ROLLBACK TRANSACTION elemento en un desencadenador:

  • Se revierten todas las modificaciones de datos realizadas hasta ese punto de la transacción actual, incluidas las que realizó el desencadenador.

  • El desencadenador continúa ejecutando las instrucciones restantes después de la ROLLBACK instrucción . Si alguna de estas instrucciones modifica datos, no se revierten las modificaciones. La ejecución de las instrucciones restantes no activa ningún desencadenador anidado.

  • Las instrucciones del lote después de la instrucción que desencadenó el desencadenador no se ejecutan.

@@TRANCOUNT se incrementa en uno al escribir un desencadenador, incluso cuando está en modo de confirmación automática. (El sistema trata a un desencadenador como a una transacción anidada implícita.)

ROLLBACK TRANSACTION Las instrucciones de los procedimientos almacenados no afectan a las instrucciones posteriores del lote que llamó al procedimiento; Se ejecutan instrucciones posteriores en el lote. ROLLBACK TRANSACTION Las instrucciones de los desencadenadores finalizan el lote que contiene la instrucción que desencadenó el desencadenador; No se ejecutan instrucciones posteriores en el lote.

El efecto de un ROLLBACK objeto en cursores se define mediante estas tres reglas:

  • Con CURSOR_CLOSE_ON_COMMIT set ON, ROLLBACK se cierra, pero no desasigna todos los cursores abiertos.

  • Con CURSOR_CLOSE_ON_COMMIT set OFF, ROLLBACK no afecta a los cursores o cursores sincrónicos STATIC o INSENSITIVE asincrónicos STATIC abiertos que se rellenaron por completo. Se cierran los cursores de otros tipos que estén abiertos, pero sin cancelar su asignación.

  • Un error que finaliza un lote y genera una operación de reversión interna cancela la asignación de todos los cursores declarados en el lote que contiene la instrucción errónea. Todos los cursores se desasignan independientemente de su tipo o de la configuración de CURSOR_CLOSE_ON_COMMIT. Esto incluye los cursores declarados en procedimientos almacenados a los que llama el lote con errores. Los cursores declarados en un lote antes de que el lote de error estén sujetos a las dos primeras reglas. Un error de interbloqueo es un ejemplo de este tipo de error. Una ROLLBACK instrucción emitida en un desencadenador también genera automáticamente este tipo de error.

Comportamiento del bloqueo

Una ROLLBACK TRANSACTION instrucción que especifica un savepoint_name libera los bloqueos adquiridos más allá del punto de guardado, excepto las escalaciones y las conversiones. Estos bloqueos no se liberan y no se convierten de nuevo al modo de bloqueo anterior.

Permisos

Debe pertenecer al rol public .

Ejemplos

En el ejemplo siguiente se muestra el efecto de revertir una transacción con nombre. Después de crear una tabla, las siguientes instrucciones inician una transacción con nombre, insertan dos filas y, a continuación, revierten la transacción denominada en la variable @TransactionName. Otra instrucción fuera de la transacción con nombre inserta dos filas. La consulta devuelve los resultados de las instrucciones anteriores.

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;

El conjunto de resultados es el siguiente:

value
-----
3
4