Práctica No. 7. Rollback Transacction.

Objetivo: Implementar transacciones que incluyan rollback y commit

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. Puede usar ROLLBACK TRANSACTION para borrar 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 mantiene la transacción.

Convenciones de sintaxis de Transact-SQL

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 solo se usan 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. 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 se debe declarar con un tipo de datos char, varchar, nchar o nvarchar.

savepoint_name

Es 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 solo 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 debe declararse con un tipo de datos char, varchar, nchar o nvarchar.

Material y equipo necesario

Cuenta de administrador

Bases de datos ejemplo

Necesita ser miembro del rol public.

Metodología

Tratamiento de errores

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.

Comentarios generales

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 savepoint_name no disminuye el valor de @@TRANCOUNT.

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, excepto cuando COMMIT TRANSACTION está asociada a una transacción anidada incluida en la transacción que se revierte. En tal caso, la transacción anidada también se revertirá, incluso si ha emitido una instrucción COMMIT TRANSACTION para ella.

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

Interoperabilidad

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:

@@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 finalizan el lote que contiene la instrucción que activó el desencadenador; no se ejecutan las siguientes instrucciones del lote.

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 desasignarlos.
  2. Con CURSOR_CLOSE_ON_COMMIT establecido en OFF, ROLLBACK no afecta a ninguno de 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 con el error están sujetos a las reglas 1 y 2. Un error de interbloqueo es un ejemplo de este tipo de error. Una instrucción ROLLBACK emitida en un desencadenador también genera automáticamente este tipo de error.

Comportamiento del bloqueo

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.

Sugerencias didácticas

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

1
USE tempdb;
GO
CREATE TABLE ValueTable ([value] int;)
GO

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

--The following statements start a named transaction,
--insert two rows, and then roll back
--the transaction named in the variable @TransactionName.
--Another statement outside of the named transaction inserts two rows.
--The query returns the results of the previous statements.

BEGIN TRAN @TransactionName
       INSERT INTO ValueTable VALUES(1), (2);
ROLLBACK TRAN @TransactionName;

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

SELECT [value] FROM ValueTable;

DROP TABLE 
00

Reporte del alumno

Ejercicios de oracle (Pagina), SQL Server y MySqL

Implementar una bitacora

Preentarlos en el formato acostumbrado

Video tutorial con resultados

Conckusiones

Bibliografía

https://msdn.microsoft.com/es-es/library/ms190295.aspx

http://proyecto359.webnode.mx/unidad4/



Anterior
Valid XHTML
home

Siguiente