miércoles, 20 de marzo de 2013

Utilizar transacciones en SQL Server

Tenemos dos tipos de transacciones en SQL Server las implícitas y las explicitas.

Implícitas: Son aquellas que no debemos indicarle al SQL que hacemos una transacción pero el lo genera, por ejemplo como el siguiente caso.

DELETE FROM TABLA1
WHERE NU_CODIGO= 1

Explicitas: Las transacciones explicitas son aquellas que nosotros indicamos con la sentencia Begin    Transaction / Commit o Rollback Transaction

Paso 1: Crear tabla

CREATE TABLE TABLA1
(
NU_CODIGO INT  PRIMARY KEY,
CH_NOMBRE VARCHAR(50),
CH_APELLIDOS VARCHAR(100)
)

Paso 2: Crear procedimiento 

CREATE PROC GUARDAR_TABLA1(
      @NU_CODIGO        integer     ,
      @CH_NOMBRE        varchar(50) ,
      @CH_APELLIDOS     varchar(50) ,
-- variable de salida , para conocer el mensaje de la transaccion
      @MESSAGE          varchar(500) output
      )
AS
-- Asignamos un nombre a la transaccion
      BEGIN TRAN TRAN_GUARDAR_TABLA1
            BEGIN TRY
                  BEGIN
                        INSERT INTO TABLA1(NU_CODIGO ,
                                           CH_NOMBRE ,
                                           CH_APELLIDOS
                                           )
                                  VALUES(@NU_CODIGO ,
                                           @CH_NOMBRE ,
                                           @CH_APELLIDOS
                                                     )
                        set @MESSAGE= 'Registro guardado'
                  END
            END TRY
            BEGIN CATCH
                  -- si se produciera algun error desacera los cambios
                  ROLLBACK TRAN TRAN_GUARDAR_TABLA1
                  -- asignara a la variable el mensaje de error
                  SET @MESSAGE      =     ERROR_MESSAGE()
            RETURN
            END CATCH
COMMIT TRAN TRAN_GUARDAR_TABLA1

Paso 3: Primera ejecución

DECLARE @MESSAGE  VARCHAR(500)
EXEC GUARDAR_TABLA1 1, 'XXX', 'YYYY', @MESSAGE OUTPUT
SELECT @MESSAGE

Mensaje devuelto: Registro guardado

Paso 4: Segunda ejecución

DECLARE @MESSAGE  VARCHAR(500)
EXEC GUARDAR_TABLA1 1, 'XXX', 'YYYY', @MESSAGE OUTPUT
SELECT @MESSAGE

Mensaje devuelto:  Infracción de la restricción PRIMARY KEY 'PK__TABLA1__8F57AAEA08EA5793'. No se puede insertar una clave duplicada en el objeto 'dbo.TABLA1'

Notas:

  • BEGIN TRANSACTION: Marca el punto de inicio de una transacción local explícita.

  • ROLLBACK :  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.

  • COMMIT: Marca el final de una transacción correcta, implícita o explícita.

  • TRY / CATCH: Implementa el control de errores para Transact-SQL que es similar al manejo de excepciones en Microsoft Visual Basic

No hay comentarios:

Publicar un comentario