Transazione autonoma in Oracle PL / SQL: commit, rollback

Sommario:

Anonim

Cosa sono le dichiarazioni TCL in PL / SQL?

TCL è l'acronimo di Transaction Control Statement. Salverà le transazioni in sospeso o ripristinerà la transazione in sospeso. Queste istruzioni svolgono un ruolo fondamentale perché, a meno che la transazione non venga salvata, le modifiche tramite istruzioni DML non verranno salvate nel database. Di seguito sono riportate le diverse istruzioni TCL.

COMMETTERE Salva tutte le transazioni in sospeso
ROLLBACK Elimina tutte le transazioni in sospeso
SAVEPOINT Crea un punto nella transazione fino al quale è possibile eseguire il rollback in un secondo momento
ROLLBACK A Elimina tutte le transazioni in sospeso fino al specificato

La transazione sarà completata nei seguenti scenari.

  • Quando viene emessa una delle dichiarazioni di cui sopra (eccetto SAVEPOINT)
  • Quando vengono emesse istruzioni DDL. (DDL sono istruzioni di commit automatico)
  • QUANDO vengono emesse le istruzioni DCL. (DCL sono istruzioni di commit automatico)

Cos'è la transazione autonoma

In PL / SQL, tutte le modifiche apportate ai dati verranno definite come una transazione. Una transazione è considerata completa quando viene applicato il salvataggio / scarto. Se non viene fornito alcun salvataggio / eliminazione, la transazione non sarà considerata completa e le modifiche apportate ai dati non saranno rese permanenti sul server.

Indipendentemente da alcune modifiche apportate durante una sessione, PL / SQL tratterà l'intera modifica come una singola transazione e il salvataggio / l'eliminazione di questa transazione influirà su tutte le modifiche in sospeso in quella sessione. Autonomous Transaction fornisce una funzionalità allo sviluppatore in cui consente di apportare modifiche in una transazione separata e di salvare / scartare quella particolare transazione senza influire sulla transazione della sessione principale.

  • Questa transazione autonoma può essere specificata a livello di sottoprogramma.
  • Per fare in modo che un sottoprogramma funzioni in una transazione diversa, la parola chiave "PRAGMA AUTONOMOUS_TRANSATION" dovrebbe essere fornita nella sezione dichiarativa di quel blocco.
  • Istruirà il compilatore a trattarla come transazione separata e il salvataggio / l'eliminazione all'interno di questo blocco non si rifletterà nella transazione principale.
  • L'emissione di COMMIT o ROLLBACK è obbligatoria prima di uscire da questa transazione autonoma alla transazione principale perché in qualsiasi momento può essere attiva una sola transazione.
  • Quindi, una volta effettuata una transazione autonoma, dobbiamo salvarla e completare la transazione, quindi solo noi possiamo tornare alla transazione principale.

Sintassi:

DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
  • Nella sintassi precedente, il blocco è stato effettuato come transazione autonoma.

Esempio 1 : in questo esempio, capiremo come funziona la transazione autonoma.

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;

Produzione

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

Spiegazione del codice:

  • Riga di codice 2 : dichiarazione di l_salary come NUMBER.
  • Riga di codice 3 : dichiarazione della procedura nested_block
  • Riga di codice 4 : creazione della procedura nested_block come "AUTONOMOUS_TRANSACTION".
  • Riga di codice 7-9: aumento dello stipendio del dipendente 1002 di 15000.
  • Riga di codice 10: commit della transazione.
  • Riga di codice 13-16: stampa dei dettagli dello stipendio dei dipendenti 1001 e 1002 prima delle modifiche.
  • Riga di codice 17-19: aumento dello stipendio del dipendente 1001 di 5000.
  • Riga di codice 20: chiamata alla procedura nested_block;
  • Riga di codice 21: scartare la transazione principale.
  • Riga di codice 22-25: stampa dei dettagli dello stipendio dei dipendenti 1001 e 1002 dopo le modifiche.
  • L'aumento di stipendio per il dipendente numero 1001 non si riflette perché la transazione principale è stata scartata. L'aumento di stipendio per il dipendente numero 1002 si riflette perché quel blocco è stato effettuato come transazione separata e salvato alla fine.
  • Quindi, indipendentemente dal salvataggio / eliminazione nella transazione principale, le modifiche alla transazione autonoma sono state salvate senza influire sulle modifiche della transazione principale.