miércoles, 21 de noviembre de 2018

Commit y Rollback de Transact-SQL

¿QUÉ ES COMMIT?

El comando COMMIT define el final de una transacción ejecutada con éxito. Este comando asegura que todas las modificaciones efectuadas durante la transacción se vuelvan parte permanente de la base. También libera los recursos utilizados por la transacción. Recuerde que no puede utilizar el comando ROLLBACK después de un COMMIT ya que los cambios son permanentes. La palabra clave TRANSACTION es opcional.

¿PARA QUÉ SE UTILIZA COMMIT?

El COMMIT se utiliza para hacer permanentes los cambios en la base de datos. 
Hasta que no se ejecuta COMMIT el resto de usuarios no ve las actualizaciones realizadas; ven los datos tal y como estaban de iniciarse la transacción. COMMIT;




La sentencia COMMIT realiza las siguientes operaciones:
  • La sentencia COMMIT realiza las siguientes operaciones:
  • Hace permanentes los cambios realizados por la transacción en curso.
  • Hace visibles esos cambios para el resto de usuarios.
  • Borra todas las marcas realizadas por las sentencias SAVEPOINT.
  • Finaliza la transacción en curso.

Este ejemplo efectúa una selección al interior de una transacción:
START TRANSACTION;
SELECT * FROM suppliers
WHERE supplier_name LIKE '%bob%';
COMMIT TRANSACTION;

¿QUÉ ES EL  ROLLBACK?

El comando ROLLBACK cancela la transacción en curso y restaura los datos a su estado anterior al comienzo de la transacción. También libera todos los recursos utilizados por la transacción. La palabra clave TRANSACTION es opcional.

¿PARA QUÉ SE UTILIZA ROLLBACK?

La sentencia se utiliza para deshacer los cambios que realizaría la transacción en curso si ésta finalizara con éxito. De este modo la base de datos no queda en un estado inconsistente si se produce un error o un fallo en medio de una transacción. ROLLBACK;



La sentencia ROLLBACK realiza las siguientes operaciones:
  • Deshace todos los cambios realizados sobre la base de datos en la transacción en curso.
  • Borra las marcas.
  • Finaliza la transacción en curso.


Este ejemplo ilustra el empleo del comando ROLLBACK:
START TRANSACTION
SELECT * FROM suppliers
WHERE supplier_name like '%bob%';
ROLLBACK TRANSACTION;

¿QUÉ SON LAS TRANSACCIONES?

Una transacción es un conjunto de operaciones Transact SQL que se ejecutan como un único bloque, es decir, si falla una operación Transact SQL fallan todas. Si una transacción tiene éxito, todas las modificaciones de los datos realizadas durante la transacción se confirman y se convierten en una parte permanente de la base de datos. Si una transacción encuentra errores y debe cancelarse o revertirse, se borran todas las modificaciones de los datos.

El final de una transacción llega de uno de estos modos:
  • Mediante una sentencia COMMIT o una sentencia ROLLBACK (modo explícito)
  • Cuando se ejecuta una sentencia de definición de datos (por ejemplo CREATE), que realiza un COMMIT automático antes y después de llevarse a cabo la definición (modo implícito).
Un ejemplo
Trabajaremos con la base de datos Northwind en nuestros ejemplos. Vamos a realizar una transacción que modifica el precio de dos productos de la base de datos.

USE NorthWind
DECLARE @Error int
--Declaramos una variable que utilizaremos para almacenar un posible código de error

BEGIN TRAN
--Iniciamos la transacción
UPDATE Products SET UnitPrice=20 WHERE ProductName ='Chai'
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su código en @Error
--y saltamos al trozo de código que deshara la transacción. Si, eso de ahí es un 
--GOTO, el demonio de los programadores, pero no pasa nada por usarlo
--cuando es necesario
IF (@Error<>0) GOTO TratarError

--Si la primera sentencia se ejecuta con éxito, pasamos a la segunda
UPDATE Products SET UnitPrice=20 WHERE ProductName='Chang'
SET @Error=@@ERROR
--Y si hay un error hacemos como antes
IF (@Error<>0) GOTO TratarError

--Si llegamos hasta aquí es que los dos UPDATE se han completado con 
--éxito y podemos "guardar" la transacción en la base de datos
COMMIT TRAN

TratarError:
--Si ha ocurrido algún error llegamos hasta aquí
If @@Error<>0 THEN
 BEGIN
 PRINT 'Ha ecorrido un error. Abortamos la transacción'
 --Se lo comunicamos al usuario y deshacemos la transacción
 --todo volverá a estar como si nada hubiera ocurrido
 ROLLBACK TRAN
 END

¿QUÉ ES SAVEPOINT?

Esta sentencia establece una marca en un punto intermedio de la transacción. A esta marca se le debe dar un nombre:
SAVEPOINT Marca_uno;

Estas marcas nos permiten subdividir transacciones que tiene muchas sentencias, proporcionándonos un mayor control sobre las mismas. Por ejemplo, si una transacción realiza varias funciones podemos poner una marca en el principio de cada función. Entonces, si una de las funciones falla, podemos volver al estado en que nos encontrábamos antes de empezar la función.

Para deshacer parte de una transacción, utilizamos las marcas previamente con la sentencia ROLLBACK. En el siguiente ejemplo se borran todas las marcas creadas después de marca_uno, aunque esta marca no se borra.
ROLLBACK TO SAVEPOINT Marca_uno;

¿QUE ES ACID?

Una unidad lógica de trabajo debe exhibir cuatro propiedades, conocidas como propiedades ACID (atomicidad, coherencia, aislamiento y durabilidad), para ser calificacada como transacción.




2 comentarios: