Anda di halaman 1dari 4

Manejo de Transacciones Implticas en SQL Server

Uno de los modos de transacciones que se conocen, aparte de las transacciones auto-commit y las explcitas, son las Transacciones Implcitas que son aquellas iniciadas por SQL Server en el caso de que no exista alguna transaccin. Las transacciones implcitas no llegan a realizar un COMMIT o ROLLBACK automticamente, siendo necesario finalizarlo explicitamente. Esto es til cuando deseamos iniciar automticamente las transacciones e ir administrando y evaluando la confirmacin o cancelacin de las mismas. Por defecto, SQL Server maneja las transacciones en modo auto-commit, es decir, en este modo SQL server inicia y termina automticamente una transaccin cuando esta no ha sido definida por el desarrollador. En fin, una transaccin implcita cuando no existen transacciones se inician con las siguientes sentencias: ALTER TABLE, CREATE, DROP, GRANT, REVOKE, OPEN, FECTH, INSERT, UPDATE, DELETE, SELECT, TRUNCATE TABLE. Para usar las transacciones implcitas debe ajustarse la conexin para que trabaje en este modo.
SET IMPLICIT_TRANSACTIONS ON;

Otra manera de ajustar a modo implcito, sera activar la opcin ANSI_DEFAULTS, con esto el modo de transaccin implcita tambin se activar. As:
SET ANSI_DEFAULTS ON

Vamos a ejecutar el siguiente cdigo y checkear si la transaccin es iniciada.


CREATE TABLE [Customers]( [CustomerID] [nchar](5) NOT NULL, [CompanyName] [nvarchar](40) NOT NULL, [ContactName] [nvarchar](30) NULL, [ContactTitle] [nvarchar](30) NULL, [Address] [nvarchar](60) NULL, [City] [nvarchar](15) NULL, [Region] [nvarchar](15) NULL, [PostalCode] [nvarchar](10) NULL, [Country] [nvarchar](15) NULL, [Phone] [nvarchar](24) NULL, [Fax] [nvarchar](24) NULL, CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ([CustomerID]) )

Ahora se necesita evaluar si alguna transaccin activa asociada a la conexin actual, para esto consultaremos el valor de @@TRANCOUNT.
SELECT @@TRANCOUNT AS [TranCount];

Vemos que el resultado indicar que hay una transaccin iniciada. Bien, hasa ahora an no hemos cerrado la transaccin anterior, entonces el siguiente cdigo se ejecutar dentro de dicha transaccin.
INSERT INTO [Customers] VALUES ( 'APRPS', 'HILARION-Abastos', 'Percy Reyes', 'Sales Representative', 'Obere Str. 57',

'Berlin', NULL, '12209', 'Germany', '030-0074321', '030-0076545' )

Ejecute el siguiente cdigo para comprobar que el nmero de transacciones sigue siendo 1.
SELECT @@TRANCOUNT AS [TranCount];

Finalmente hacemos un ROLLBACK TRAN ( un COMMIT TRAN), y pasamos a evaluar el valor de @@TRANCOUNT (como se a venido haciendo) para comprobar que el nmero de transacciones activas ahora es cero.
ROLLBACK TRAN GO SELECT @@TRANCOUNT AS [TranCount];

Entonces, como hemos hecho un ROLLBACK TRAN, no debe existir la tabla Customers que se pretendi crear al inicio. Para comprobarlo puede hacer un simple SELECT a la tabla, y SQL Server Engine le devolver un error indicndole que no existe dicha tabla. Por ltimo, la volver a modo auto-commit, haga lo siguiente:
SET IMPLICIT_TRANSACTIONS OFF;

Cuando estemos trabajando con transacciones implcitas podra darse el caso de que en algn momento olvidemos de hacer el COMMIT TRAN correspondiente originando ms adelante transacciones grandes, y posiblemente provocando bloqueos con otras conexiones, o teniedo ROLLBACKs indeseados debido a conexiones cerradas. Se recomienda no olvidar realizar el COMMIT TRAN o ROLLBACK TRAN cuando trabaje en este modo. La transaccin finaliza cuando se ejecuta un comando de control de transacciones como rollback o commit work (se puede abreviar poniendo simplemente commit). Un ejemplo:
BEGIN .... update alumnos set edad=20 where n_alumno=109; update nuevos set apellido='perez' where n_alumno=200; commit work; ... EXCEPTION WHEN OTHERS THEN rollback work; END;

Comandos utilizados para el control de transacciones


Commit Este comando da por concluida la transaccin actual y hace definitivos los cambios realizados liberando las filas bloqueadas. Slo despus de que se ejecute commit tendremos acceso a los datos modificados. Rollback Este comando da por concluida la transaccin actual y deshace los cambios que se pudiesen haber producido en la misma, liberando las filas bloqueadas. Se utiliza especialmente cuando no se puede concluir una transaccin porque se han levantado excepciones. Savepoint Se utiliza para poner marcas o puntos de salvaguarda al procesar transacciones. Se utiliza junto con rollback permitiendo deshacer cambios hasta los savepoint. El nmero de savepoint esta limitado a 5 por sesin pero lo podemos modificar con la siguiente sentencia:
savepoint numero;

Rollback implicito Este comando se ejecuta cuando un programa almacenado (procedimiento o funcin) falla y no se controla la excepcin que produjo el fallo. Pero si en el programa tenemos un commit estos cambios no sern deshechos. Rollback to Deshace el trabajo realizado despus del punto indicado. Pero no se confirma el trabajo hecho hasta el savepoint. La transaccin no finaliza hasta que se ejecuta un comando de control de transacciones o hasta que finaliza la sesin. Os dejo a continuacin un ejemplo bastante completo de lo que seria el control de transacciones:
create or replace procedure prueba (nfilas number) as begin savepoint ninguna; insert into tmp values ('primera fila'); savepoint una; insert into tmp values ('segunda fila'); savepoint dos; if nfilas=1 then rollback to una; else if nfilas=2 then rollback to dos; else rollback to ninguna; end if;

commit; exception when other then rollback end prueba;

Con este artculo terminamos la parte bsica sobre oracle, PL/SQL y pasamos a lo que podemos denominar programacin avanzada de sql

Anda mungkin juga menyukai