Autonom transaktion i Oracle PL / SQL
โก Smart opsummering
Transaktionskontrolerklรฆringer i Oracle PL/SQL, nรฆrmere bestemt COMMIT, ROLLBACK og SAVEPOINT, bestemmer, om ventende DML-รฆndringer gemmes eller kasseres. En autonom transaktion kรธrer som et uafhรฆngigt underprogram, der committer eller ruller tilbage separat fra hovedtransaktionen.

Hvad er TCL-erklรฆringer i PL/SQL?
TCL stรฅr for Transaction Control Statements (Transaktionskontrolerklรฆringer). Disse erklรฆringer gemmer enten de ventende transaktioner eller ruller dem tilbage. De spiller en afgรธrende rolle, fordi medmindre en transaktion gemmes, vil de รฆndringer, der foretages via DML erklรฆringer vil ikke blive gemt permanent i databasen. Nedenfor er de forskellige TCL-sรฆtninger i PL / SQL.
| Statement | Beskrivelse |
|---|---|
| COMMIT | Gemmer alle ventende transaktioner. |
| RULBACK | Kasserer alle ventende transaktioner. |
| SAVEPOINT | Opretter et punkt i transaktionen, indtil hvilket en rollback kan foretages senere. |
| TILBAGE TIL | Sletter alle ventende transaktioner op til det angivne lagringspunkt. |
Transaktionen vil vรฆre gennemfรธrt under fรธlgende scenarier:
- Nรฅr en af โโovenstรฅende erklรฆringer udstedes (undtagen SAVEPOINT).
- Nรฅr DDL-udsagn udstedes (DDL er auto-commit-udsagn).
- Nรฅr DCL-udsagn udstedes (DCL er auto-commit-udsagn).
Brug af SAVEPOINT og ROLLBACK TO
Tabellen ovenfor introducerer SAVEPOINT og ROLLBACK TO, og sammen giver de dig delvis kontrol over en transaktion. Et SAVEPOINT markerer et navngivet punkt i den aktuelle transaktion. En senere ROLLBACK TO til det gemte punkt fortryder alle รฆndringer foretaget efter det, mensping det arbejde, der blev udfรธrt fรธr det, intakt.
Dette er nyttigt, nรฅr en lang transaktion udfรธrer flere SQL trin, og kun det sidste trin mislykkes. I stedet for at kassere hele transaktionen kan du rulle tilbage til det sidste gode gemte punkt og fortsรฆtte.
Syntaks:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Vigtige punkter at huske pรฅ om savepoints:
- Et SAVEPOINT findes kun i den aktuelle transaktion; en COMMIT eller en fuld ROLLBACK sletter alle savepoints.
- Nรฅr du vender tilbage til et gemte punkt, slettes alle gemte punkter, der er oprettet efter det, men det gemte punkt, du vender tilbage til, bevares.
- ROLLBACK TO afslutter ikke transaktionen; รฆndringer foretaget fรธr gemte punktet forbliver ventende, indtil du udfรธrer COMMIT eller ROLLBACK.
- Hvis du genbruger et navn pรฅ et gemt punkt, flytter det nyere gemte punkt markรธren til den senere position.
Fordi ROLLBACK TO lader transaktionen vรฆre รฅben, bestemmer du stadig til sidst, om du vil COMMIT de resterende รฆndringer eller kassere dem med en fuld ROLLBACK.
Hvad er autonom transaktion
I PL/SQL kaldes alle รฆndringer foretaget pรฅ data en transaktion. En transaktion betragtes som fuldfรธrt, nรฅr der foretages en gemning eller kassering pรฅ den. Hvis der ikke angives nogen gemning eller kassering, betragtes transaktionen ikke som fuldfรธrt, og รฆndringerne foretaget pรฅ dataene vil ikke blive permanente pรฅ serveren.
Som standard behandler PL/SQL alle รฆndringer under en session som en enkelt transaktion, og lagring eller kassering af denne transaktion pรฅvirker alle ventende รฆndringer i sessionen. En autonom transaktion giver udvikleren mulighed for at foretage รฆndringer i en separat transaktion og gemme eller kassere den pรฅgรฆldende transaktion uden at pรฅvirke hovedsessionstransaktionen.
- En autonom transaktion kan specificeres pรฅ underprogramniveau.
- At lave evt underprogram arbejde i en anden transaktion, skal nรธgleordet PRAGMA AUTONOMOUS_TRANSACTION angives i den deklarative del af den blok.
- Den instruerer compileren til at behandle dette som en separat transaktion, og lagring eller kassering i denne blok vil ikke afspejles i hovedtransaktionen.
- Det er obligatorisk at udstede COMMIT eller ROLLBACK, fรธr man forlader denne autonome transaktion og vender tilbage til hovedtransaktionen, da kun รฉn transaktion kan vรฆre aktiv pรฅ noget tidspunkt.
- Sรฅ nรฅr en autonom transaktion er startet, skal den gemmes og fuldfรธres, fรธr kontrollen kan vende tilbage til hovedtransaktionen.
Syntaks:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
I ovenstรฅende syntaks er blokken blevet gjort til en autonom transaktion.
Eksempel 1: I dette eksempel vil vi forstรฅ, hvordan en autonom transaktion fungerer.
Skรฆrmbilledet nedenfor viser dette eksempel pรฅ en autonom transaktion og dens output i 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;
Produktion
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 Forklaring:
- Code linje 2: Deklarerer l_salary som NUMBER.
- Code linje 3: Deklarering af nested_block-proceduren.
- Code linje 4: Gรธr nested_block-proceduren til en AUTONOMOUS_TRANSACTION.
- Code linje 7-9: Forhรธjelse af lรธnnen for medarbejder nummer 1002 med 15000.
- Code linje 10: Udfรธrelse af den autonome transaktion.
- Code linje 13-16: Udskrivning af lรธnoplysninger for medarbejdere 1001 og 1002 fรธr รฆndringerne.
- Code linje 17-19: Forhรธjelse af lรธnnen for medarbejder nummer 1001 med 5000.
- Code linje 20: Kald af nested_block-proceduren.
- Code linje 21: Kassering af hovedtransaktionen.
- Code linje 22-25: Udskrivning af lรธnoplysninger for medarbejdere 1001 og 1002 efter รฆndringerne.
Lรธnforhรธjelsen for medarbejder nummer 1001 afspejles ikke, fordi hovedtransaktionen er blevet kasseret. Lรธnforhรธjelsen for medarbejder nummer 1002 afspejles, fordi den pรฅgรฆldende blok er blevet gjort til en separat transaktion og gemt til sidst.
Sรฅ uanset om der gemmes eller kasseres ved hovedtransaktionen, gemmes รฆndringerne i den autonome transaktion uden at pรฅvirke hovedtransaktionen.
Hvornรฅr skal man bruge autonome transaktioner
Autonome transaktioner er effektive, sรฅ det er nyttigt at vide, hvornรฅr de passer ind. Reserver dem til arbejde, der skal lykkes eller mislykkes uafhรฆngigt af hovedtransaktionen, ikke til kerneforretningslogik. Almindelige anvendelsesscenarier inkluderer:
- Revisionslogning: Registrer hvem der รฆndrede fรธlsomme data, hvornรฅr, og de gamle og nye vรฆrdier, sรฅ loggen bevares, selvom hovedtransaktionen rulles tilbage.
- Fejllogning: Skriv en fejlpost i en undtagelse handler og COMMIT den, sรฅ de diagnostiske detaljer bevares, mens den mislykkede transaktion kasseres.
- Tรฆllere og statistikker: Fremfรธr en brugstรฆller eller et hittรฆller, der skal bevares uanset opkalderens resultat.
- COMMIT inde i en trigger: En trigger kan ikke udstede COMMIT direkte; en autonom transaktion er den eneste understรธttede mรฅde at gรธre det pรฅ.
Undgรฅ autonome transaktioner til almindelige opdateringer, der skal dele skรฆbne med hovedtransaktionen. Overforbrug af dem kan skjule data bag uafhรฆngige commits og gรธre fejlfinding vanskeligere. Som regel skal enhver autonom blok afsluttes med en eksplicit COMMIT eller ROLLBACK.
Autonome vs. regelmรฆssige transaktioner
Forskellen mellem en almindelig (hoved)transaktion og en autonom transaktion kommer an pรฅ omfang og uafhรฆngighed. Tabellen nedenfor sammenligner dem.
| Aspect | Regelmรฆssig transaktion | Autonom transaktion |
|---|---|---|
| Anvendelsesomrรฅde | Deler รฉn sessionstransaktion | Kรธrer som en separat underordnet transaktion |
| COMMIT / ROLLBACK-effekt | Pรฅvirker alle ventende sessionsรฆndringer | Pรฅvirker kun den autonome blok |
| Erklรฆring | Standardadfรฆrd | PRAGMA AUTONOM_TRANSAKTION i den deklarative sektion |
| Effekt af tilbagerulning af forรฆldre | รndringer gรฅr tabt | Forpligtede autonome รฆndringer bevares |
| Typisk brug | Kerneforretningslogik | Revision og fejllogning |
I modsรฆtning til en almindelig indlejret blok, hvis รฆndringer altid deler resultatet af den omgivende transaktion, stรฅr en autonom blok alene. Forstรฅelse af denne forskel hjรฆlper dig med at beslutte, hvornรฅr en blok skal vรฆre uafhรฆngig, og hvornรฅr den skal dele resultatet af hovedtransaktionen.

