Oracle
 sql >> Database >  >> RDS >> Oracle

Qual è l'effetto di inserire il commit dopo DML nella procedura?

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

La documentazione Oracle descrive COMMIT come:

Scopo

Usa il COMMIT dichiarazione 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 delle transazioni.

Se hai tre PROCEDURE e ognuno contiene un COMMIT istruzione quindi non puoi eseguire tutti e tre quindi, se si verifica un'eccezione in quest'ultima, ROLLBACK tutti loro in quanto le modifiche delle prime due saranno già COMMIT ted.

Come regola generale, dovresti non usa COMMIT in una PROCEDURE o FUNCTION ma dovrebbe lasciare al chiamante il compito di COMMIT la transazione in modo che possano raggruppare più azioni insieme.

Ci sono, ovviamente, casi d'uso in cui vorrai violare questa regola, ma dovresti considerare ogni caso separatamente e dedicare del tempo a comprendere appieno la tua logica aziendale prima di infrangere questa regola in modo da sapere cos'è COMMIT ted in ogni caso.

Devo effettuare questa transazione come AUTONOMOUS_TRANSACTION ?

Un caso d'uso è la registrazione:potresti avere una 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 registrazione PROCEDURE dovrebbe essere una AUTONOMOUS_TRANSACTION e contengono un COMMIT istruzione e l'istruzione chiamante dovrebbero (probabilmente) non avere nessuno dei due.

Quindi, se il COMMIT di una PROCEDURE è sempre obbligatorio ed è indipendente dal fatto che il chiamante sia COMMIT s altri dati quindi eseguire la PROCEDURE un AUTONOMOUS_TRANSACTION . Se la PROCEDURE s possono essere raggruppati insieme e quindi ROLLBACK come gruppo allora non vuoi renderli AUTONOMOUS_TRANSACTION s.