Autonomní transakce v Oracle PL/SQL: Potvrdit, vrátit zpět

Co jsou příkazy TCL v PL/SQL?

TCL je zkratka pro Transaction Control Statements. Buď uloží čekající transakce, nebo vrátí čekající transakci zpět. Tyto příkazy hrají zásadní roli, protože pokud není transakce uložena, změny prostřednictvím příkazů DML se neuloží do databáze. Níže jsou uvedena různá prohlášení TCL.

SPÁCHAT Uloží všechny čekající transakce
NÁVRAT Zahoďte všechny čekající transakce
ULOŽIT BOD Vytvoří bod v transakci, do kterého lze později provést vrácení zpět
NÁVRAT DO Zrušte všechny čekající transakce do zadané

Transakce bude dokončena za následujících scénářů.

  • Když je vydáno jakékoli z výše uvedených prohlášení (kromě SAVEPOINT)
  • Když jsou vydávány příkazy DDL. (DDL jsou příkazy automatického potvrzení)
  • KDYŽ jsou vydávány příkazy DCL. (DCL jsou příkazy automatického potvrzení)

Co je autonomní transakce

V PL/SQL budou všechny úpravy provedené na datech označeny jako transakce. Transakce je považována za dokončenou, když je na ni aplikováno uložení/zahození. Pokud není zadáno žádné uložení/zahození, transakce nebude považována za dokončenou a úpravy provedené na datech nebudou na serveru trvalé.

Bez ohledu na některé úpravy provedené během relace, PL / SQL bude celou modifikaci považovat za jedinou transakci a uložení/zahození této transakce ovlivní všechny čekající změny v dané relaci. Autonomní transakce poskytuje vývojáři funkci, ve které umožňuje provádět změny v samostatné transakci a uložit/zrušit tuto konkrétní transakci, aniž by to ovlivnilo transakci hlavní relace.

  • Tato autonomní transakce může být specifikována na úrovni podprogramu.
  • Aby jakýkoli podprogram fungoval v jiné transakci, mělo by být v deklarativní části tohoto bloku uvedeno klíčové slovo 'PRAGMA AUTONOMOUS_TRANSATION'.
  • Dává kompilátoru pokyn, aby to považoval za samostatnou transakci a uložení/zahození uvnitř tohoto bloku se neprojeví v hlavní transakci.
  • Vydání COMMIT nebo ROLLBACK je povinné před přechodem z této autonomní transakce do hlavní transakce, protože v každém okamžiku může být aktivní pouze jedna transakce.
  • Jakmile tedy provedeme autonomní transakci, musíme ji uložit a transakci dokončit, poté se můžeme vrátit zpět k hlavní transakci.

Syntaxe:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • Ve výše uvedené syntaxi byl blok proveden jako autonomní transakce.

Příklad 1: V tomto příkladu pochopíme, jak funguje autonomní transakce.

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;

Výstup

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

Autonomní transakce

Vysvětlení kódu:

  • Řádek kódu 2: Deklaruji l_plat jako ČÍSLO.
  • Řádek kódu 3: Deklarace procedury nested_block
  • Řádek kódu 4: Provedení procedury nested_block jako 'AUTONOMOUS_TRANSACTION'.
  • Řádek 7–9 kódu: Zvýšení platu pro zaměstnance číslo 1002 o 15000 XNUMX.
  • Řádek kódu 10: Potvrzení transakce.
  • Řádek 13–16 kódu: Tisk podrobností o platu zaměstnance 1001 a 1002 před změnami.
  • Řádek 17–19 kódu: Zvýšení platu pro zaměstnance číslo 1001 o 5000 XNUMX.
  • Řádek kódu 20: Volání procedury nested_block;
  • Řádek kódu 21: Zrušení hlavní transakce.
  • Řádek 22–25 kódu: Tisk podrobností o platu zaměstnance 1001 a 1002 po změnách.
  • Zvýšení platu pro zaměstnance číslo 1001 není zohledněno, protože hlavní transakce byla vyřazena. Zvýšení platu pro zaměstnance číslo 1002 je zohledněno, protože tento blok byl proveden jako samostatná transakce a na konci uložen.
  • Takže bez ohledu na uložení/zahození při hlavní transakci byly změny při autonomní transakci uloženy, aniž by to ovlivnilo změny hlavní transakce.