Tranzacție autonomă în Oracle PL/SQL: Commit, Rollback

Ce sunt instrucțiunile TCL în PL/SQL?

TCL înseamnă Declarații de control al tranzacțiilor. Fie va salva tranzacțiile în așteptare, fie va anula tranzacția în așteptare. Aceste declarații joacă un rol vital deoarece dacă tranzacția nu este salvată, modificările prin declarații DML nu vor fi salvate în baza de date. Mai jos sunt diferitele declarații TCL.

COMITEAZA Salvează toată tranzacția în așteptare
REALIZARE Renunțați la toate tranzacțiile în așteptare
PUNT DE SALVARE Creează un punct în tranzacție până la care derularea poate fi efectuată ulterior
ROLLBACK LA Aruncă toate tranzacțiile în așteptare până la momentul specificat

Tranzacția va fi finalizată în următoarele scenarii.

  • Când se emite oricare dintre declarațiile de mai sus (cu excepția SAVEPOINT)
  • Când sunt emise declarații DDL. (DDL sunt declarații de auto-commit)
  • CÂND sunt emise declarațiile DCL. (DCL sunt declarații de auto-commit)

Ce este Tranzacția Autonomă

În PL/SQL, toate modificările efectuate asupra datelor vor fi denumite tranzacție. O tranzacție este considerată ca fiind completă atunci când i se aplică salvarea/renunțarea. Dacă nu se acordă nicio salvare/renunțare, atunci tranzacția nu va fi considerată ca finalizată, iar modificările efectuate asupra datelor nu vor fi permanente pe server.

Indiferent de unele modificări efectuate în timpul unei sesiuni, PL / SQL va trata întreaga modificare ca o singură tranzacție și salvarea/renunțarea acestei tranzacții afectează toate modificările în așteptare din acea sesiune. Tranzacție autonomă oferă dezvoltatorului o funcționalitate în care permite să facă modificări într-o tranzacție separată și să salveze/renunțe la respectiva tranzacție fără a afecta tranzacția sesiunii principale.

  • Această tranzacție autonomă poate fi specificată la nivel de subprogram.
  • Pentru ca orice subprogram să funcționeze într-o tranzacție diferită, cuvântul cheie „PRAGMA AUTONOMOUS_TRANSATION” ar trebui să fie specificat în secțiunea declarativă a blocului respectiv.
  • Acesta va instrui compilatorul să trateze aceasta ca tranzacție separată, iar salvarea/eliminarea în acest bloc nu se va reflecta în tranzacția principală.
  • Emiterea COMMIT sau ROLLBACK este obligatorie înainte de a ieși din această tranzacție autonomă la tranzacția principală deoarece în orice moment poate fi activă o singură tranzacție.
  • Deci, odată ce am făcut o tranzacție autonomă, trebuie să o salvăm și să finalizam tranzacția, atunci doar noi putem reveni la tranzacția principală.

Sintaxă:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • În sintaxa de mai sus, blocul a fost realizat ca o tranzacție autonomă.

Exemplu 1: În acest exemplu, vom înțelege cum funcționează tranzacția autonomă.

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;

producție

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

Tranzacție autonomă

Explicația codului:

  • Linia de cod 2: se declară l_salary ca NUMBER.
  • Linia de cod 3: Declararea procedurii nested_block
  • Linia de cod 4: Efectuarea procedurii nested_block ca „AUTONOMOUS_TRANSACTION”.
  • Linia de cod 7-9: Creșterea salariului pentru angajatul numărul 1002 cu 15000.
  • Linia de cod 10: Angajarea tranzacției.
  • Linia de cod 13-16: Tipărirea detaliilor salariale ale angajatului 1001 și 1002 înainte de modificări.
  • Linia de cod 17-19: Creșterea salariului pentru angajatul numărul 1001 cu 5000.
  • Linia de cod 20: Apelarea procedurii nested_block;
  • Linia de cod 21: Înlăturarea tranzacției principale.
  • Linia de cod 22-25: Tipărirea detaliilor salariale ale angajatului 1001 și 1002 după modificări.
  • Creșterea salariului pentru angajatul numărul 1001 nu este reflectată deoarece tranzacția principală a fost eliminată. Creșterea salariului pentru angajatul numărul 1002 se reflectă deoarece acel bloc a fost făcut ca tranzacție separată și salvat la final.
  • Deci, indiferent de salvarea/renunțarea la tranzacția principală, modificările la tranzacția autonomă au fost salvate fără a afecta modificările tranzacției principale.