ROLLBACK TRANSACTION (Transact-SQL)

Revierte una transacción explícita o implícita hasta el inicio de la transacción o hasta un punto de retorno dentro de la transacción.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • transaction_name
    Es el nombre asignado a la transacción en BEGIN TRANSACTION. transaction_name debe ajustarse a las reglas para los identificadores, pero sólo se utilizan los 32 primeros caracteres del nombre de la transacción. Cuando se anidan transacciones,transaction_name debe ser el nombre de la instrucción BEGIN TRANSACTION más externa.

  • **@**tran_name_variable
    Es el nombre de una variable definida por el usuario que contiene un nombre de transacción válido. La variable se debe declarar con un tipo de datos char, varchar, nchar o nvarchar.

  • savepoint_name
    savepoint_name de una instrucción SAVE TRANSACTION. savepoint_name debe ajustarse a las reglas para los identificadores. Utilice savepoint_name cuando una operación de reversión condicional sólo deba afectar a parte de la transacción.

  • **@**savepoint_variable
    Es el nombre de una variable definida por el usuario que contiene un nombre de punto de retorno válido. La variable se debe declarar con un tipo de datos char, varchar, nchar o nvarchar.

Comentarios

ROLLBACK TRANSACTION borra todas las modificaciones de datos realizadas desde el inicio de la transacción o hasta un punto de retorno. También libera los recursos que retiene la transacción.

ROLLBACK TRANSACTION sin savepoint_name o transaction_name revierte todas las instrucciones hasta el principio de la transacción. Cuando se trata de transacciones anidadas, esta misma instrucción revierte todas las transacciones internas hasta la instrucción BEGIN TRANSACTION más externa. En ambos casos, ROLLBACK TRANSACTION disminuye la función del sistema @@TRANCOUNT a 0. ROLLBACK TRANSACTION con savepoint_name no disminuye @@TRANCOUNT.

Una instrucción ROLLBACK TRANSACTION que especifica un savepoint_name libera todos los bloqueos adquiridos más allá del punto de retorno, a excepción de las extensiones y las conversiones. Estos bloqueos no se liberan y no vuelven a convertirse a su modo de bloqueo previo.

ROLLBACK TRANSACTION no puede hacer referencia a un argumento savepoint_name en transacciones distribuidas que se inician de forma explícita con BEGIN DISTRIBUTED TRANSACTION o que se extienden desde una transacción local.

Una transacción no se puede revertir después de ejecutar una instrucción COMMIT TRANSACTION.

En una transacción se permiten nombres de puntos de retorno duplicados, pero una instrucción ROLLBACK TRANSACTION que utilice este nombre sólo revierte las transacciones realizadas hasta la instrucción SAVE TRANSACTION más reciente que también utilice este nombre.

En procedimientos almacenados, las instrucciones ROLLBACK TRANSACTION sin un argumento savepoint_name o transaction_name revierten todas las instrucciones hasta la instrucción BEGIN TRANSACTION más externa. Una instrucción ROLLBACK TRANSACTION de un procedimiento almacenado que provoca que @@TRANCOUNT muestre un valor diferente cuando finaliza el procedimiento almacenado del valor de @@TRANCOUNT en el momento de la llamada al procedimiento almacenado, genera un mensaje informativo. Este mensaje no afecta a los siguientes procesos.

Si se emite la instrucción ROLLBACK TRANSACTION 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 la ejecución del resto de las instrucciones después de la instrucción ROLLBACK. 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.

  • Tampoco se ejecutan las instrucciones del lote después de la instrucción que activó el desencadenador.

@@TRANCOUNT se incrementa en uno al entrar en 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.)

Las instrucciones ROLLBACK TRANSACTION de los procedimientos almacenados no afectan a las siguientes instrucciones del lote que llamó al procedimiento; se ejecutan las siguientes instrucciones del lote. Las instrucciones ROLLBACK TRANSACTION de los desencadenadores finaliza el lote que contiene la instrucción que activó el desencadenador; no se ejecutan las siguientes instrucciones del lote.

Una instrucción ROLLBACK TRANSACTION no produce ningún mensaje para el usuario. Si necesita indicar advertencias en procedimientos almacenados o en desencadenadores, utilice las instrucciones RAISERROR o PRINT. RAISERROR es la instrucción más adecuada para indicar errores.

El efecto de ROLLBACK en los cursores se define mediante estas reglas:

  1. Con CURSOR_CLOSE_ON_COMMIT establecido en ON, ROLLBACK cierra todos los cursores abiertos pero sin cancelar su asignación.

  2. Con CURSOR_CLOSE_ON_COMMIT establecido en OFF, ROLLBACK no afecta a los cursores STATIC o INSENSITIVE sincrónicos abiertos o a los cursores STATIC asincrónicos que se hayan llenado completamente. Se cierran los cursores de otros tipos que estén abiertos, pero sin cancelar su asignación.

  3. 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. Se cancela la asignación de todos los cursores 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 del lote erróneo están sujetos a las reglas 1 y 2. Un error de interbloqueo constituye un ejemplo de este tipo de error. Una instrucción ROLLBACK emitida en un desencadenador también genera automáticamente este tipo de error.

Para obtener un ejemplo de código que muestra ROLLBACK TRANSACTION, vea Anidar transacciones.

Permisos

Debe pertenecer a la función public.

Ejemplos

En el ejemplo siguiente se muestra el efecto de revertir una transacción con nombre.

USE TempDB;
GO

CREATE TABLE ValueTable ([value] int)
GO

DECLARE @TransactionName varchar(20) = 'Transaction1';

--These statements start a named transaction,
--insert a two records, and then roll back
--the transaction named in the variable 
--@TransactionName.
BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1)
       INSERT INTO ValueTable VALUES(2)
ROLLBACK TRAN @TransactionName

INSERT INTO ValueTable VALUES(3)
INSERT INTO ValueTable VALUES(4)

SELECT * FROM ValueTable

DROP TABLE ValueTable

--Results
--value
-------------
--3
--4