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 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 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
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: Impresión de los detalles salariales de los empleados 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: Impresión de los detalles salariales de los empleados 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.