Transacción Autónoma en Oracle PL/SQL: confirmar, revertir

¿Qué son las declaraciones TCL en PL/SQL?

TCL significa Declaraciones de control de transacciones. Guardará las transacciones pendientes o las revertirá. Estas declaraciones desempeñan un papel vital porque, a menos que se guarde la transacción, los cambios a través de declaraciones DML no se guardarán en la base de datos. A continuación se muestran las diferentes declaraciones de TCL.

COMETER Guarda todas las transacciones pendientes.
RETROCEDER Descartar todas las transacciones pendientes
PUNTO DE GUARDADO Crea un punto en la transacción hasta el cual se puede realizar la reversión. later
VOLVER A Descartar todas las transacciones pendientes hasta el especificado

La transacción se completará de la siguiente manerawing escenarios.

  • Cuando se emita cualquiera de las declaraciones anteriores (excepto SAVEPOINT)
  • Cuando se emiten declaraciones DDL. (DDL son declaraciones de confirmación automática)
  • CUÁNDO se emiten las declaraciones DCL. (DCL son declaraciones de confirmación automática)

¿Qué es la transacción autónoma?

En PL/SQL, todas las modificaciones realizadas en los datos se denominarán transacción. Una transacción se considera completa cuando se le aplica la función guardar/descartar. Si no se guarda/descarta, la transacción no se considerará completa y las modificaciones realizadas en los datos no se harán permanentes en el servidor.

Independientemente de algunas modificaciones realizadas durante una sesión, PL / SQL tratará toda la modificación como una sola transacción y guardar/descartar esta transacción afecta a todos los cambios pendientes en esa sesión. La transacción autónoma proporciona una funcionalidad al desarrollador que le permite realizar cambios en una transacción separada y guardar/descartar esa transacción en particular sin afectar la transacción de la sesión principal.

  • Esta transacción autónoma se puede especificar a nivel de subprograma.
  • Para hacer que cualquier subprograma funcione en una transacción diferente, se debe proporcionar la palabra clave "PRAGMA AUTONOMOUS_TRANSATION" en la sección declarativa de ese bloque.
  • Le indicará al compilador que trate esto como una transacción separada y guardar/descartar dentro de este bloque no se reflejará en la transacción principal.
  • Es obligatorio emitir COMMIT o ROLLBACK antes de salir de esta transacción autónoma a la transacción principal porque en cualquier momento solo puede haber una transacción activa.
  • Entonces, una vez que realizamos una transacción autónoma, debemos guardarla y completarla, luego solo nosotros podemos volver a la transacción principal.

Sintaxis:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • En la sintaxis anterior, el bloque se realizó como una transacción autónoma.

Ejemplo : En este ejemplo, entenderemos cómo funciona la transacción autónoma.

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

Salida

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Transacción autónoma

Explicación del código:

  • Línea de código 2: Declarando l_salario como NÚMERO.
  • Línea de código 3: Declaración del procedimiento nested_block
  • Línea de código 4: Hacer que el procedimiento nested_block sea 'AUTONOMOUS_TRANSACTION'.
  • Línea de código 7-9: Incrementar el salario del empleado número 1002 en 15000.
  • Línea de código 10: Comprometiendo la transacción.
  • Línea de código 13-16: Imprimir el salario details del empleado 1001 y 1002 antes de los cambios.
  • Línea de código 17-19: Incrementar el salario del empleado número 1001 en 5000.
  • Línea de código 20: Llamar al procedimiento nested_block;
  • Línea de código 21: Descartando la transacción principal.
  • Línea de código 22-25: Imprimir el salario details del empleado 1001 y 1002 después de los cambios.
  • El incremento salarial del empleado número 1001 no se refleja porque se ha descartado la transacción principal. El aumento de salario para el empleado número 1002 se refleja porque ese bloque se realizó como una transacción separada y se guardó al final.
  • Entonces, independientemente de guardar/descartar en la transacción principal, los cambios en la transacción autónoma se guardaron sin afectar los cambios de la transacción principal.