Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLAzure Synapse Analytics
Analytics Platform System (PDW)
Almacenamiento en Microsoft Fabric
Base 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
ROLLBACKinstrucció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_COMMITestablecido enON,ROLLBACKcierra pero no desasigna todos los cursores abiertos.Con
CURSOR_CLOSE_ON_COMMITestablecidoOFFen ,ROLLBACKno afecta a los cursores sincrónicosSTATICniINSENSITIVEasincrónicos abiertos ni a los cursores asincrónicosSTATICque 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
ROLLBACKinstrucció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