Autonomna transakcija u Oracle PL/SQL: Potvrda, Vraćanje

Što su TCL izjave u PL/SQL?

TCL je kratica za Transaction Control Statements. To će ili spremiti transakcije na čekanju ili vratiti transakciju na čekanju. Ove izjave igraju ključnu ulogu jer ako se transakcija ne spremi, promjene kroz DML izjave neće biti spremljene u bazi podataka. Ispod su različite TCL izjave.

POČINITI Sprema sve transakcije na čekanju
VRAĆANJE Odbacite sve transakcije na čekanju
TOČKA SPREME Stvara točku u transakciji do koje se kasnije može izvršiti vraćanje
POVRATAK NA Odbacite sve transakcije na čekanju do navedenog

Transakcija će biti dovršena prema sljedećim scenarijima.

  • Kada se izda bilo koja od gornjih izjava (osim SAVEPOINT)
  • Kada se izdaju DDL izjave. (DDL su auto-commit izjave)
  • KADA se izdaju DCL izvodi. (DCL su izjave za automatsko preuzimanje)

Što je autonomna transakcija

U PL/SQL-u će se sve izmjene učinjene na podacima nazivati ​​transakcijom. Transakcija se smatra dovršenom kada se na nju primijeni spremanje/odbacivanje. Ako nije dano spremanje/odbacivanje, tada se transakcija neće smatrati dovršenom i izmjene učinjene na podacima neće biti trajne na poslužitelju.

Bez obzira na neke izmjene učinjene tijekom sesije, PL / SQL tretirat će cijelu izmjenu kao jednu transakciju i spremanje/odbacivanje ove transakcije utječe na sve promjene na čekanju u toj sesiji. Autonomna transakcija razvojnom programeru pruža funkcionalnost u kojoj dopušta uvođenje promjena u zasebnoj transakciji i spremanje/odbacivanje te određene transakcije bez utjecaja na transakciju glavne sesije.

  • Ova autonomna transakcija može se specificirati na razini potprograma.
  • Da bi bilo koji potprogram radio u drugoj transakciji, ključna riječ 'PRAGMA AUTONOMOUS_TRANSATION' treba biti dana u deklarativnom odjeljku tog bloka.
  • Uputit će kompilator da to tretira kao zasebnu transakciju, a spremanje/odbacivanje unutar ovog bloka neće se odraziti na glavnu transakciju.
  • Izdavanje COMMIT ili ROLLBACK je obavezno prije izlaska iz ove autonomne transakcije u glavnu transakciju jer u bilo kojem trenutku samo jedna transakcija može biti aktivna.
  • Dakle, nakon što smo napravili autonomnu transakciju, trebamo je spremiti i dovršiti transakciju tek tada se možemo vratiti na glavnu transakciju.

Sintaksa:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • U gornjoj sintaksi, blok je napravljen kao autonomna transakcija.

Primjer 1: U ovom primjeru ćemo razumjeti kako funkcionira autonomna transakcija.

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;

Izlaz

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

Autonomna transakcija

Objašnjenje koda:

  • Kodna linija 2: Deklariranje l_plaće kao BROJ.
  • Kodna linija 3: Deklaracija nested_block procedure
  • Kodna linija 4: Izrada nested_block procedure kao 'AUTONOMOUS_TRANSACTION'.
  • Redak koda 7-9: Povećanje plaće zaposleniku broj 1002 za 15000.
  • Redak koda 10: Izvršavanje transakcije.
  • Redak koda 13-16: Ispis podataka o plaći zaposlenika 1001 i 1002 prije promjena.
  • Redak koda 17-19: Povećanje plaće zaposleniku broj 1001 za 5000.
  • Redak koda 20: Pozivanje procedure nested_block;
  • Redak koda 21: Odbacivanje glavne transakcije.
  • Redak koda 22-25: Ispis podataka o plaći zaposlenika 1001 i 1002 nakon promjena.
  • Povećanje plaće za zaposlenika broj 1001 nije prikazano jer je glavna transakcija odbačena. Povećanje plaće za zaposlenika broj 1002 se odražava jer je taj blok napravljen kao zasebna transakcija i spremljen na kraju.
  • Dakle, bez obzira na spremanje/odbacivanje u glavnoj transakciji, promjene u autonomnoj transakciji su spremljene bez utjecaja na promjene glavne transakcije.