Compartir a través de


TRANSACCIÓN DE REVERSIÓN (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Almacenamiento en Microsoft FabricBase de datos SQL 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. Se usa ROLLBACK TRANSACTION para borrar todas las modificaciones de datos realizadas desde el inicio de la transacción o desde un punto de retorno. ROLLBACK TRANSACTION también libera los recursos mantenidos por la transacción.

Esta instrucción no borra los cambios realizados en variables locales o variables de tabla.

Convenciones de sintaxis de Transact-SQL

Syntax

Sintaxis de SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.

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

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

ROLLBACK { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.

Nombre asignado a la transacción con 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. Cuando hay transacciones internas, 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 del motor de base de datos no distingue mayúsculas de minúsculas.

@tran_name_variable

Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores, Azure SQL Database, Azure SQL Managed Instance, SQL Database en Microsoft Fabric.

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 reversión solo debe afectar a la parte de la transacción después del punto de retorno.

@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 .

Remarks

ROLLBACK TRANSACTION sin un savepoint_name o transaction_name revierte al principio de la transacción. Cuando hay transacciones internas, 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 promocionadas 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á asociado a una transacción interna contenida dentro de la transacción que se está reviertiendo. En este caso, la transacción interna 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.

Nota:

El motor de base de datos no admite transacciones anidadas administrables de forma independiente. Confirmación de una disminución de @@TRANCOUNT transacción interna, pero no tiene otros efectos. Una reversión de una transacción interna siempre revierte la transacción externa, a menos que exista un punto de guardado y se especifique en la ROLLBACK instrucción .

Interoperability

En los procedimientos almacenados, una ROLLBACK TRANSACTION instrucción sin un savepoint_name o transaction_name revierte todas las instrucciones al más BEGIN TRANSACTIONexterno. Una ROLLBACK TRANSACTION instrucción de un procedimiento almacenado que hace @@TRANCOUNT que tenga un valor diferente al finalizar el procedimiento que el valor en el inicio del procedimiento 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 un desencadenador como una transacción interna implícita.

Una ROLLBACK TRANSACTION instrucción de un procedimiento almacenado no afecta a las instrucciones posteriores del lote que llamó al procedimiento. Se ejecutan instrucciones posteriores en el lote.

Una ROLLBACK TRANSACTION instrucción de un desencadenador finaliza 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 los cursores se define mediante las reglas siguientes:

  • Con CURSOR_CLOSE_ON_COMMIT establecido en ON, ROLLBACK cierra pero no desasigna todos los cursores abiertos.

  • Con CURSOR_CLOSE_ON_COMMIT establecido OFFen , ROLLBACK no afecta a los cursores sincrónicos STATIC ni INSENSITIVE asincrónicos abiertos ni a los cursores asincrónicos STATIC que se rellenan completamente. Se cierran los cursores de otros tipos que estén abiertos, pero sin cancelar su asignación.

  • Error que finaliza un lote y revierte la transacción desasigna todos los cursores declarados en el lote que contiene la instrucción que genera el error. Todos los cursores se desasignan independientemente de su tipo o de la configuración de CURSOR_CLOSE_ON_COMMIT. Esto incluye cursores declarados en procedimientos almacenados llamados por el lote que produce el error. Los cursores declarados en un lote antes de que el lote genere el error están sujetos a las dos reglas anteriores.

    Un interbloqueo es un ejemplo de este tipo de error. Una ROLLBACK instrucción emitida en un desencadenador también da como resultado este comportamiento.

Comportamiento de bloqueo

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

Permissions

Requiere la pertenencia al rol public.

Examples

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;
CREATE TABLE ValueTable
(
    value INT
);

DECLARE @TransactionName AS 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;

Este es el conjunto de resultados.

value
-----
3
4