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
Code Vysvětlení:
- Code linka 2: Deklaruji l_plat jako ČÍSLO.
- Code linka 3: Deklarace procedury nested_block
- Code linka 4: Provedení procedury nested_block jako 'AUTONOMOUS_TRANSACTION'.
- Code řádek 7–9: Zvýšení platu pro zaměstnance číslo 1002 o 15000 XNUMX.
- Code řádek 10: Potvrzení transakce.
- Code řádek 13–16: Tisk podrobností o platu zaměstnance 1001 a 1002 před změnami.
- Code řádek 17–19: Zvýšení platu pro zaměstnance číslo 1001 o 5000 XNUMX.
- Code řádek 20: Volání procedury nested_block;
- Code řádek 21: Zrušení hlavní transakce.
- Code řádek 22–25: 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.

