Entre las habilidades de
todo Sistema Gestor de Bases de Datos Relaciones tiene que estar la de
permitir al programador crear transacciones. El SQL Server nos permite
trabajar con transacciones de manera sencilla y eficaz.
Introducción
Una transacción es
un conjunto de operaciones que van a ser tratadas como una única
unidad. Estas transacciones deben cumplir 4 propiedades fundamentales comúnmente
conocidas como ACID (atomicidad, coherencia, asilamiento y durabilidad).
La transacción más
simple en SQL Server es una única sentencia SQL. Por ejemplo una
sentencia como esta:
UPDATE
Products SET UnitPrice=20 WHERE ProductName =Chai
Es una transacción.
Esta es una transacción
autocommit, una transacción autocompletada.
Cuando enviamos esta sentencia
al SQL Server se escribe en el fichero de transacciones lo que va a ocurrir
y a continuación realiza los cambios necesarios en la base de datos.
Si hay algún tipo de problema al hacer esta operación el
SQL Server puede leer en el fichero de transacciones lo que se estaba haciendo
y si es necesario puede devolver la base de datos al estado en el que se
encontraba antes de recibir la sentencia.
Por supuesto este tipo de
transacciones no requieren de nuestra intervención puesto que el
sistema se encarga de todo. Sin embargo si hay que realizar varias operaciones
y queremos que sean tratadas como una unidad tenemos que crear esas transacciones
de manera explícita.
Sentencias para una transacción
Como decíamos una
transacción es un conjunto de operaciones tratadas como una sola.
Este conjunto de operaciones debe marcarse como transacción para
que todas las operaciones que la conforman tengan éxito o todas
fracasen.
La sentencia que se utiliza
para indicar el comienzo de una transacción es BEGIN TRAN.
Si alguna de las operaciones
de una transacción falla hay que deshacer la transacción
en su totalidad para volver al estado inicial en el que estaba la base
de datos antes de empezar. Esto se consigue con la sentencia ROLLBACK
TRAN.
Si todas las operaciones
de una transacción se completan con éxito hay que marcar
el fin de una transacción para que la base de datos vuelva a estar
en un estado consistente con la sentencia COMMIT TRAN.
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
Como se puede ver para cada
sentencia que se ejecuta miramos si se ha producido o no un error, y si
detectamos un error ejecutamos el bloque de código que deshace la
transacción.
Continua
Aqui » |