Transazione autonoma in Oracle PL/SQL: commit, rollback
Cosa sono le istruzioni TCL in PL/SQL?
TCL sta per Dichiarazioni di controllo delle transazioni. 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 dichiarazioni TCL.
COMMETTERE | Salva tutta la transazione in sospeso |
RITORNO | Scarta tutte le transazioni in sospeso |
PUNTO DI RISPARMIO | Crea un punto nella transazione fino al quale il rollback può essere eseguito in seguito |
ROLLBACK A | Scarta tutte le transazioni in sospeso fino a quelle specificate |
La transazione sarà completata nei seguenti scenari.
- Quando viene rilasciata una delle dichiarazioni di cui sopra (eccetto SAVEPOINT)
- Quando vengono emesse istruzioni DDL. (I DDL sono istruzioni di commit automatico)
- QUANDO vengono emesse le dichiarazioni DCL. (DCL sono istruzioni di commit automatico)
Cos'è la transazione autonoma
In PL/SQL, tutte le modifiche apportate ai dati verranno definite transazioni. Una transazione è considerata completata quando ad essa viene applicato il salvataggio/scarto. Se non viene fornito alcun salvataggio/scarto, la transazione non verrà considerata completata 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/eliminazione di questa transazione influirà su tutte le modifiche in sospeso in quella sessione. La transazione autonoma fornisce una funzionalità allo sviluppatore in cui consente di apportare modifiche in una transazione separata e di salvare/annullare quella particolare transazione senza influenzare la transazione della sessione principale.
- Questa transazione autonoma può essere specificata a livello di sottoprogramma.
- Per far sì che qualsiasi sottoprogramma funzioni in una transazione diversa, la parola chiave "PRAGMA AUTONOMOUS_TRANSATION" dovrebbe essere fornita nella sezione dichiarativa di quel blocco.
- Indica al compilatore di trattarla come una transazione separata e il salvataggio/eliminazione all'interno di questo blocco non si rifletterà nella transazione principale.
- L'emissione di COMMIT o ROLLBACK è obbligatoria prima di passare da questa transazione autonoma alla transazione principale perché in qualsiasi momento può essere attiva solo una transazione.
- Quindi, una volta effettuata una transazione autonoma, dobbiamo salvarla e completare la transazione, solo allora potremo tornare alla transazione principale.
Sintassi:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- Nella sintassi precedente il blocco è stato effettuato come transazione autonoma.
esempio 1: In questo esempio, capiremo come funziona la transazione autonoma.
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;
Uscita
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
Spiegazione del codice:
- Riga di codice 2: Dichiarando l_stipendio come NUMERO.
- Riga di codice 3: Dichiarazione della procedura nested_block
- Riga di codice 4: Rendere la procedura nested_block come 'AUTONOMOUS_TRANSACTION'.
- Riga di codice 7-9: Aumento dello stipendio del dipendente numero 1002 di 15000.
- Riga di codice 10: Impegno 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 numero 1001 di 5000.
- Riga di codice 20: Chiamare la 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 viene riflesso 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.
- Pertanto, indipendentemente dal salvataggio/eliminazione nella transazione principale, le modifiche nella transazione autonoma sono state salvate senza influire sulle modifiche della transazione principale.