oracle - ¿Cuál es el efecto de colocar el commit después de DML en el procedimiento?
oracle11g (3)
¿Cuál es el efecto de colocar el commit como este en el programa?
La
documentación de Oracle
describe
COMMIT
como:
Propósito
Use la declaración
COMMIT
para finalizar su transacción actual y hacer permanentes todos los cambios realizados en la transacción. Una transacción es una secuencia de sentencias SQL que Oracle Database trata como una sola unidad. Esta declaración también borra todos los puntos de guardado en la transacción y libera bloqueos de transacción.
Si tiene tres
PROCEDURE
y cada uno contiene una declaración de
COMMIT
, entonces no puede ejecutar los tres, entonces, si se produce una excepción en uno de estos últimos,
ROLLBACK
a todos ya que los cambios de los dos primeros ya estarán
COMMIT
.
Como regla general, no debe usar
COMMIT
en un
PROCEDURE
o
FUNCTION
sino que debe dejar que la persona que llama
COMMIT
la transacción para que puedan agrupar varias acciones.
Hay, por supuesto, casos de uso en los que querrá violar esta regla, pero debe considerar cada caso por separado y tomarse el tiempo para comprender completamente su lógica comercial antes de romper esta regla para que sepa lo que se
COMMIT
en cada caso.
¿Debo hacer esta transacción como
AUTONOMOUS_TRANSACTION
?
Un caso de uso es el registro: puede tener un
PROCEDURE
que llama a otro
PROCEDURE
para registrar las acciones del usuario y, independientemente de si la acción inicial tiene éxito o no, desea mantener un registro de la acción y asegurarse de que el registro se
COMMIT
.
En este caso, el
PROCEDURE
registro debe ser una
AUTONOMOUS_TRANSACTION
y contener una instrucción
COMMIT
y la instrucción de llamada no debería (probablemente) tener ninguno.
Por lo tanto, si el
COMMIT
de un
PROCEDURE
siempre se requiere y es independiente de si la persona que llama
COMMIT
otros datos, entonces convierte el
PROCEDURE
una
AUTONOMOUS_TRANSACTION
.
Si los
PROCEDURE
se pueden agrupar y luego
ROLLBACK
como grupo, entonces no desea convertirlos en
AUTONOMOUS_TRANSACTION
.
He creado un procedimiento en un paquete que está haciendo inserción / eliminación en la tabla y después de una transacción exitosa, se realiza la confirmación.
Me gusta esto:
create or replace package pac is
procedure pr_test(emp_id number)
is
begin
-- some code
if something then
insert
else
delete
commit;
end pr_test;
end pac ;
¿Debo hacer esta transacción como AUTONOMOUS_TRANSACTION? ¿Cuál es el efecto de colocar el commit como este en el programa?
Depende de lo que quieras hacer.
Si desea que el procedimiento sea una transacción independiente, le recomendaría agregar
pragma autonomous_transaction
.
Ej: primer escenario
- actualizar la tabla 1
- pragma autonom_transaction -> actualizar tabla 2 -> commit
- Retroceder
la tabla 2 se comprometerá y la tabla 1 se revertirá
Ej: segundo escenario
- Actualizar tabla 1
- actualizar tabla 2 -> commit
- Retroceder
ambos cuadros 1 y 2 se comprometerán porque lo trata como una transacción
Te sugiero que consultes este artículo. Aclarará sus consultas.
El pragma AUTONOMOUS_TRANSACTION indica al compilador que trate el bloque pl / sql que sigue al pragma como autónomo (independiente) de la transacción de llamada.
Si lo hace, la transacción autónoma depende únicamente de los criterios de uso. En ambos sentidos, COMMIT tiene que colocarse dentro.
El siguiente ejemplo lo ilustrará claramente.
CREATE OR REPLACE
PROCEDURE testav
AS
PRAGMA AUTONOMOUS_TRANSACTION; --Declaring is Autonomous Transaction.
BEGIN
INSERT INTO testa VALUES
(''1'',''2'',sysdate
);
commit;
END;
DECLARE
lv_num NUMBER;
BEGIN
testav; -- Calling the Procedure
lv_num:=to_number(''av''); --This will fail to parse but the procedure call will be successfull even though the calling block has failed.
END;
/ /