ROLLBACK TRANSACTION (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW) Warehouse 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 }
[ ; ]
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 TRANSACTION
externo. 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
setON
,ROLLBACK
se cierra, pero no desasigna todos los cursores abiertos.Con
CURSOR_CLOSE_ON_COMMIT
setOFF
,ROLLBACK
no afecta a los cursores o cursores sincrónicosSTATIC
oINSENSITIVE
asincrónicosSTATIC
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. UnaROLLBACK
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;
Este es el conjunto de resultados.
value
-----
3
4