lunes, 27 de diciembre de 2010

Autonomous Transaction


Es una funcionalidad del PL/SQL en la cual un subprograma puede actuar independientepemente de la transacción que lo contiene.




Miremos como funciona con este ejemplo ....

CREATE TABLE tabla1 (campo int);
CREATE TABLE tabla2 (campo int);
CREATE SEQUENCE secuencia_s ;


/* Este es un trigger normal de inserción, si la transaccion se deshace,
se deshace la insercion en la tabla2 */

CREATE OR REPLACE TRIGGER pa_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
 i PLS_INTEGER;
BEGIN
  select secuencia_s.nextval into i from dual;
  INSERT INTO tabla2
  VALUES
  (i);
END;
 

INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
SELECT COUNT(*) FROM tabla2;
count(*)
0


Ahora miremoslo con la transacción autónoma

CREATE OR REPLACE TRIGGER PA_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
 i PLS_INTEGER;
BEGIN
  select secuencia_s.nextval into i from dual;
  INSERT INTO tabla2
  VALUES
  (i);
  COMMIT;
END;

/*Realizamos la inserción */
 INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1

/* si deshacemos la transacción  de la tabla1 */
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0


/* la transacción de la tabla2 quedara confirmada, Es ideal para  manejar logs */
SELECT COUNT(*) FROM tabla2;
count(*)
1

No hay comentarios:

Publicar un comentario