Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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',
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;
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;
Con este artculo terminamos la parte bsica sobre oracle, PL/SQL y pasamos a lo que podemos denominar programacin avanzada de sql