Qual è l’effetto dell’inserimento del commit dopo DML nella procedura?

Ho creato una procedura in un pacchetto che sta facendo insert / delete nella tabella e dopo aver eseguito correttamente la transazione, il commit è terminato.

come questo:

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 ; 

Devo effettuare questa transazione come AUTONOMOUS_TRANSACTION? Qual è l’effetto di inserire il commit in questo modo in programma?

Qual è l’effetto di inserire il commit in questo modo in programma?

La documentazione Oracle descrive COMMIT come:

Scopo

Utilizzare l’istruzione COMMIT per terminare la transazione corrente e rendere permanenti tutte le modifiche eseguite nella transazione. Una transazione è una sequenza di istruzioni SQL che Oracle Database considera come una singola unità. Questa istruzione cancella anche tutti i punti di salvataggio nella transazione e rilascia i blocchi di transazione.

Se si dispone di tre PROCEDURE e ognuno contiene un’istruzione COMMIT , non è ansible eseguire tutti e tre quindi, se si verifica un’eccezione in quest’ultima, ROLLBACK tutti come le modifiche dai primi due saranno già COMMIT ted.

Come regola generale, non utilizzare COMMIT in una PROCEDURE o FUNCTION ma lasciare che sia il chiamante a COMMIT la transazione in modo che possano raggruppare più azioni insieme.

Esistono, ovviamente, casi in cui si vorrebbe violare questa regola, ma è necessario considerare ogni caso separatamente e prendersi del tempo per comprendere appieno la logica aziendale prima di infrangere questa regola in modo da sapere cosa è COMMIT ted in ogni istanza.

Devo effettuare questa transazione come AUTONOMOUS_TRANSACTION ?

Un caso d’uso è il logging – si può avere un PROCEDURE che chiama un altro PROCEDURE per registrare le azioni dell’utente e, indipendentemente dal fatto che l’azione iniziale abbia esito positivo o negativo, si desidera mantenere un registro dell’azione e assicurarsi che il registro sia COMMIT ted. In questo caso, la PROCEDURE registrazione dovrebbe essere un AUTONOMOUS_TRANSACTION e contenere una dichiarazione COMMIT e l’istruzione di chiamata dovrebbe (probabilmente) non avere né.

Quindi, se il COMMIT di una PROCEDURE è sempre richiesto ed è indipendente dal fatto che gli altri dati COMMIT del chiamante rendano la PROCEDURE un AUTONOMOUS_TRANSACTION . Se i PROCEDURE possono essere raggruppati insieme e poi ROLLBACK come gruppo, allora non vuoi renderli AUTONOMOUS_TRANSACTION .

Dipende da cosa vuoi fare. Se si desidera che la procedura sia una transazione autonoma, si consiglia di aggiungere pragma autonomous_transaction .

Es: Primo scenario

  1. aggiorna la tabella 1
  2. pragma autonomous_transaction -> update table 2 -> commit
  3. rollback

la tabella 2 verrà confermata e la tabella 1 verrà ripristinata

Es: Secondo scenario

  1. Aggiorna tabella 1
  2. aggiorna la tabella 2 -> commit
  3. rollback

entrambe le tabelle 1 e 2 saranno commesse perché trattate come una transazione

Ti suggerirei di fare riferimento a questo articolo. Chiarirà le tue domande.

AUTONOMOUS_TRANSACTION

Il pragma AUTONOMOUS_TRANSACTION indica al compilatore di considerare il blocco pl / sql che segue il pragma come autonomo (indipendente) dalla transazione chiamante.

Se lo fai, la transazione autonoma dipende esclusivamente dai criteri di utilizzo. In entrambi i modi in cui deve essere collocato COMMIT.

Sotto l’esempio lo illustreremo chiaramente.

 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; 

/