Autonomna transakcija u Oracle PL / SQL
⚡ Pametni sažetak
Izjave o kontroli transakcija u Oracle PL/SQL, odnosno COMMIT, ROLLBACK i SAVEPOINT, odlučuju hoće li se spremati ili odbaciti promjene DML-a na čekanju. Autonomna transakcija se izvršava kao neovisni podprogram koji potvrđuje (commit) ili poništava (rollback) odvojeno od glavne transakcije.
Što su TCL izjave u PL/SQL?
TCL je kratica za Transaction Control Statements (Naredbe za kontrolu transakcija). Ove naredbe ili spremaju transakcije na čekanju ili ih poništavaju. Igraju vitalnu ulogu jer, osim ako se transakcija ne spremi, promjene napravljene putem DML izjave neće biti trajno pohranjeni u bazi podataka. U nastavku su navedene različite TCL naredbe u PL / SQL.
| Izjava | Description |
|---|---|
| POČINITI | Sprema sve transakcije na čekanju. |
| VRAĆANJE | Odbacuje sve transakcije na čekanju. |
| TOČKA SPREME | Stvara točku u transakciji do koje se kasnije može izvršiti vraćanje na prethodno stanje. |
| POVRATAK NA | Odbacuje sve transakcije na čekanju do određene točke spremanja. |
Transakcija će biti dovršena u sljedećim scenarijima:
- Kada se izda bilo koja od gore navedenih izjava (osim SAVEPOINT).
- Kada se izdaju DDL naredbe (DDL su naredbe s automatskim potvrđivanjem).
- Kada se izdaju DCL naredbe (DCL su naredbe s automatskim potvrđivanjem).
Korištenje SAVEPOINT-a i ROLLBACK-a
Gornja tablica predstavlja SAVETOČKU i ROLLBACK NA, a zajedno vam daju djelomičnu kontrolu nad transakcijom. SAVETOČKA označava imenovanu točku unutar trenutne transakcije. Kasniji ROLLBACK NA tu točku spremanja poništava svaku promjenu napravljenu nakon nje, dok keeping posao obavljen prije nego što je ostao netaknut.
Ovo je korisno kada duga transakcija izvršava nekoliko SQL korake i samo zadnji korak ne uspije. Umjesto odbacivanja cijele transakcije, možete se vratiti na posljednju ispravnu točku spremanja i nastaviti.
Sintaksa:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Ključne stvari koje treba zapamtiti o točkama spremanja:
- SAVETOČKA postoji samo unutar trenutne transakcije; COMMIT ili potpuni ROLLBACK briše svaku točku spremanja.
- Kada se vratite na točku spremanja, sve točke spremanja stvorene nakon nje se brišu, ali točka spremanja na koju se vratite ostaje.
- ROLLBACK TO ne završava transakciju; promjene napravljene prije točke spremanja ostaju na čekanju dok ne izvršite COMMIT ili ROLLBACK.
- Ako ponovno upotrijebite naziv točke spremanja, novija točka spremanja pomiče oznaku na kasniju poziciju.
Budući da ROLLBACK TO ostavlja transakciju otvorenom, na kraju i dalje odlučujete hoćete li potvrdjivati preostale promjene ili ih odbaciti potpunim ROLLBACK-om.
Što je autonomna transakcija
U PL/SQL-u, sve izmjene podataka nazivaju se transakcijom. Transakcija se smatra dovršenom kada se na nju primijeni naredba za spremanje ili odbacivanje. Ako se ne zada naredba za spremanje ili odbacivanje, transakcija se ne smatra dovršenom i izmjene podataka neće biti trajne na poslužitelju.
Prema zadanim postavkama, PL/SQL tretira sve izmjene tijekom sesije kao jednu transakciju, a spremanje ili odbacivanje te transakcije utječe na svaku promjenu na čekanju u sesiji. Autonomna transakcija pruža programeru mogućnost da napravi promjene u zasebnoj transakciji i da spremi ili odbaci tu određenu transakciju bez utjecaja na glavnu transakciju sesije.
- Autonomna transakcija može se specificirati na razini potprograma.
- Da bi bilo koji potprogram rade u drugoj transakciji, ključna riječ PRAGMA AUTONOMOUS_TRANSACTION treba biti navedena u deklarativnom dijelu tog bloka.
- Upućuje kompajler da ovo tretira kao zasebnu transakciju, a spremanje ili odbacivanje unutar ovog bloka neće se odraziti na glavnu transakciju.
- Izdavanje naredbi COMMIT ili ROLLBACK je obavezno prije napuštanja ove autonomne transakcije i povratka na glavnu transakciju, jer u bilo kojem trenutku samo jedna transakcija može biti aktivna.
- Dakle, nakon što se započne autonomna transakcija, ona se mora spremiti i dovršiti prije nego što se kontrola može vratiti glavnoj transakciji.
Sintaksa:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
U gornjoj sintaksi, blok je postao autonomna transakcija.
Primjer 1: U ovom primjeru ćemo razumjeti kako funkcionira autonomna transakcija.
Snimka zaslona u nastavku prikazuje ovaj primjer autonomne transakcije i njezin izlaz u Oracle.
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
Code Objašnjenje:
- Code redak 2: Deklarisanje l_plaće kao BROJ.
- Code redak 3: Deklariranje procedure nested_block.
- Code redak 4: Pretvaranje procedure nested_block u AUTONOMNU_TRANSAKCIJU.
- Code redak 7-9: Povećanje plaće zaposleniku broj 1002 za 15000.
- Code redak 10: Potvrda autonomne transakcije.
- Code redak 13-16: Ispis podataka o plaćama zaposlenika 1001 i 1002 prije promjena.
- Code redak 17-19: Povećanje plaće zaposleniku broj 1001 za 5000.
- Code redak 20: Pozivanje procedure nested_block.
- Code redak 21: Odbacivanje glavne transakcije.
- Code redak 22-25: Ispis podataka o plaćama 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 prikazano je jer je taj blok napravljen kao zasebna transakcija i spremljen na kraju.
Dakle, bez obzira na spremanje ili odbacivanje u glavnoj transakciji, promjene u autonomnoj transakciji spremaju se bez utjecaja na glavnu transakciju.
Kada koristiti autonomne transakcije
Autonomne transakcije su moćne, stoga je korisno znati kada odgovaraju. Rezervirajte ih za posao koji mora uspjeti ili propasti neovisno o glavnoj transakciji, a ne za osnovnu poslovnu logiku. Uobičajeni slučajevi upotrebe uključuju:
- Zapisivanje revizije: Zabilježite tko je promijenio osjetljive podatke, kada te stare i nove vrijednosti, tako da zapisnik preživi čak i ako se glavna transakcija poništi.
- Zapisivanje pogrešaka: Zapišite zapis o pogrešci unutar izuzetak rukovatelj i COMMIT, tako da se dijagnostički detalji čuvaju dok se neuspješna transakcija odbacuje.
- Brojači i statistike: Unaprijed postavite brojač korištenja ili broj pogodaka koji mora trajati bez obzira na ishod pozivatelja.
- COMMIT unutar okidača: Okidač ne može izravno izdati COMMIT; autonomna transakcija je jedini podržani način za to.
Izbjegavajte autonomne transakcije za obična ažuriranja koja bi trebala dijeliti sudbinu glavne transakcije. Prekomjerna upotreba istih može sakriti podatke iza neovisnih commitova i otežati otklanjanje pogrešaka. U pravilu, svaki autonomni blok mora završiti s eksplicitnim COMMIT-om ili ROLLBACK-om.
Autonomne vs. redovne transakcije
Razlika između redovne (glavne) transakcije i autonomne transakcije svodi se na opseg i neovisnost. Tablica u nastavku ih uspoređuje.
| Aspekt | Redovna transakcija | Autonomna transakcija |
|---|---|---|
| Djelokrug | Dijeli jednu transakciju sesije | Izvodi se kao zasebna podređena transakcija |
| Učinak COMMIT / ROLLBACK | Utječe na sve promjene sesije na čekanju | Utječe samo na autonomni blok |
| izjava | Zadano ponašanje | PRAGMA AUTONOMOUS_TRANSACTION u deklarativnom dijelu |
| Učinak vraćanja roditelja | Promjene su izgubljene | Potvrđene autonomne promjene se čuvaju |
| Tipična upotreba | Osnovna poslovna logika | Revizija i zapisivanje pogrešaka |
Za razliku od običnog ugniježđeni blok, čije promjene uvijek dijele ishod transakcije koja ga obuhvaća, autonomni blok stoji sam za sebe. Razumijevanje ove razlike pomaže vam da odlučite kada blok treba biti neovisan, a kada treba dijeliti rezultat glavne transakcije.


