+505 27133089 | contacto@ing-sistemas.com
    Twitter
  • Facebook
  • Instagram

Transacciones en SQL Server

Introducci贸n

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.

La transacci贸n m谩s simple en SQL Server es una 煤nica sentencia SQL. una transacci贸n ‘autocommit’, una transacci贸n autocompletada.

UPDATE clientes SET sexo='F' WHERE sexo ='FEMENINO'

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

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’.

Ejemplo:


DECLARE @Monto DECIMAL(18,2),
@CuentaADecrementar VARCHAR(12),
@CuentaAIncrementar VARCHAR(12) 

/* Asignamos el monto de la transacci贸n y las cuentas a afectar*/

SET @Monto = 1900 
SET @CuentaADecrementar = '20161206'
SET @CuentaAIncrementar = '20161207' 

BEGIN TRANSACTION 
BEGIN TRY

/* Descontamos el monto de la cuenta a decrementar */
UPDATE CUENTAS SET SALDO = SALDO - @Monto WHERE NUMCUENTA = @CuentaADecrementar 

/* Registramos el movimiento */
INSERT INTO MOVIMIENTOS (IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR,IMPORTE, FXMOVIMIENTO)

/* Incrementamos el monto de la cuenta a incrementar */
UPDATE CUENTAS SET SALDO = SALDO + @Monto WHERE NUMCUENTA = @CuentaAIncrementar 

/* Registramos el movimiento */
INSERT INTO MOVIMIENTOS (IDCUENTA, SALDO_ANTERIOR, SALDO_POSTERIOR, IMPORTE, FXMOVIMIENTO)

/* Confirmamos la transaccion*/
COMMIT TRANSACTION 

END TRY

BEGIN CATCH

/* Ocurri贸 un error, deshacemos los cambios*/ 
ROLLBACK TRANSACTION
PRINT 'Ha ocurrido un error!'

END CATCH

La transacci贸n sigue activa hasta que emita una instrucci贸n COMMIT o ROLLBACK. Una vez que la primera transacci贸n se ha confirmado o revertido, se inicia autom谩ticamente una nueva transacci贸n la siguiente vez que la conexi贸n ejecuta una聽instruccion para modificar datos.

Transacciones anidadas

Podemos anidar varias transacciones. Cuando anidamos varias transacciones la instrucci贸n COMMIT afectar谩 a la 煤ltima transacci贸n abierta, pero ROLLBACK afectar谩 a todas las transacciones abiertas.

Un hecho a tener en cuenta, es que, si hacemos ROLLBACK de la transacci贸n superior se desharan tambi茅n los cambios de todas las transacciones internas, aunque hayamos realizado COMMIT de ellas.

Puntos de recuperacion (SavePoint)

Los puntos de recuperaci贸n (SavePoints)聽permiten manejar las transacciones por pasos, pudiendo hacer rollbacks hasta un punto marcado por el savepoint y no por toda la transacci贸n.

Ejemplo:

 
BEGIN TRAN 

UPDATE Clientes SET Estado = 'Inactivo' WHERE iddepartamento = 1020 

UPDATE Clientes SET Estado = 'DeBaja' WHERE iddepartamento=7025

SAVE TRANSACTION Punto1 -- Guardamos la transaccion (Savepoint)

UPDATE Clientes SET Descripcion = 'Ninguna' WHERE idcliente=5896

-- Este ROLLBACK afecta solo a las instrucciones posteriores al savepoint Punto1.

ROLLBACK TRANSACTION Punto1 

-- Confirmamos la transaccion

COMMIT

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *