Transacción autónoma en Oracle PL / SQL: confirmación, reversión

Tabla de contenido:

Anonim

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

TCL son las siglas de Transaction Control Statements. Guardará las transacciones pendientes o revertirá la transacción pendiente. Estas declaraciones juegan 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 toda la transacción pendiente
RETROCEDER Descartar toda la transacción pendiente
PUNTO DE GUARDADO Crea un punto en la transacción hasta el cual se puede realizar una reversión más tarde
VOLVER A Descartar todas las transacciones pendientes hasta el especificado

La transacción se completará en los siguientes escenarios.

  • Cuando se emite alguna 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 el guardado / descarte. Si no se da guardar / descartar, 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. Autonomous Transaction proporciona una funcionalidad al desarrollador en la que permite hacer 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 que cualquier subprograma funcione en una transacción diferente, se debe dar 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.
  • Emitir COMMIT o ROLLBACK es obligatorio antes de salir de esta transacción autónoma a la transacción principal porque en cualquier momento solo una transacción puede estar activa.
  • Entonces, una vez que hicimos una transacción autónoma, necesitamos guardarla y completar la transacción, entonces solo nosotros podemos regresar a la transacción principal.

Sintaxis:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • En la sintaxis anterior, el bloque se ha realizado como una transacción autónoma.

Ejemplo 1 : En este ejemplo, vamos a entender cómo está funcionando la transacción autónoma.

DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT 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 empSET salary = salary + 5000WHERE 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;

Producción

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

Explicación del código:

  • Línea de código 2 : declarando l_salary como NUMBER.
  • Línea de código 3 : declaración de procedimiento nested_block
  • Línea de código 4 : Haciendo el procedimiento nested_block como 'AUTONOMOUS_TRANSACTION'.
  • Línea de código 7-9: Aumentar el salario del empleado número 1002 en 15000.
  • Línea de código 10: Confirmación de la transacción.
  • Línea de código 13-16: Impresión de los detalles salariales del empleado 1001 y 1002 antes de los cambios.
  • Línea de código 17-19: Aumentar el salario del empleado número 1001 en 5000.
  • Línea de código 20: Llamando al procedimiento nested_block;
  • Línea de código 21: Descartando la transacción principal.
  • Línea de código 22-25: Impresión de los detalles salariales del empleado 1001 y 1002 después de los cambios.
  • El aumento de salario para el empleado número 1001 no se refleja porque se descartó 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 del guardado / descarte en la transacción principal, los cambios en la transacción autónoma se han guardado sin afectar los cambios de la transacción principal.