Autonom transaksjon i Oracle PL / SQL
โก Smart oppsummering
Transaksjonskontrolluttalelser i Oracle PL/SQL, nรฆrmere bestemt COMMIT, ROLLBACK og SAVEPOINT, avgjรธr om ventende DML-endringer lagres eller forkastes. En autonom transaksjon kjรธrer som et uavhengig delprogram som utfรธrer en commit eller rollback separat fra hovedtransaksjonen.

Hva er TCL-uttalelser i PL/SQL?
TCL stรฅr for Transaction Control Statements (transaksjonskontrollutsagn). Disse utsagnene lagrer enten ventende transaksjoner eller tilbakestiller ventende transaksjoner. De spiller en viktig rolle, fordi med mindre en transaksjon lagres, vil endringene som gjรธres gjennom DML uttalelser vil ikke bli lagret permanent i databasen. Nedenfor er de forskjellige TCL-setningene i PL / SQL.
| Uttalelse | Tekniske beskrivelser |
|---|---|
| BEGร | Lagrer alle ventende transaksjoner. |
| TILBAKE | Forkaster alle ventende transaksjoner. |
| SAVEPOINT | Oppretter et punkt i transaksjonen som en tilbakerulling kan gjรธres opp til senere. |
| TILBAKE TIL | Forkaster alle ventende transaksjoner frem til det angitte lagringspunktet. |
Transaksjonen vil bli fullfรธrt under fรธlgende scenarier:
- Nรฅr noen av de ovennevnte utstedelsene utstedes (unntatt SAVEPOINT).
- Nรฅr DDL-setninger utstedes (DDL er auto-commit-setninger).
- Nรฅr DCL-setninger utstedes (DCL er auto-commit-setninger).
Bruke SAVEPOINT og ROLLBACK TO
Tabellen ovenfor introduserer LAGREPOINT og TILBAKERULLING TIL, og sammen gir de deg delvis kontroll over en transaksjon. Et LAGREPOINT markerer et navngitt punkt i den gjeldende transaksjonen. En senere TILBAKERULLING TIL det lagringspunktet angrer alle endringer som er gjort etter det, mensping arbeidet som ble gjort fรธr det intakt.
Dette er nyttig nรฅr en lang transaksjon utfรธrer flere SQL trinn, og bare det siste trinnet mislykkes. I stedet for รฅ forkaste hele transaksjonen, kan du rulle tilbake til det siste gode lagringspunktet og fortsette.
Syntaks:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
Viktige punkter รฅ huske pรฅ om lagringspunkter:
- Et SAVEPOINT finnes bare i den gjeldende transaksjonen; en COMMIT eller en fullstendig ROLLBACK sletter alle savepoints.
- Nรฅr du ruller tilbake til et lagringspunkt, slettes alle lagringspunkter som ble opprettet etter det, men lagringspunktet du ruller tilbake til beholdes.
- ROLLBACK TO avslutter ikke transaksjonen; endringene som ble gjort fรธr lagringspunktet forblir ventende inntil du COMMIT eller ROLLBACK.
- Hvis du bruker et lagringspunktnavn pรฅ nytt, flytter det nyere lagringspunktet markรธren til den senere posisjonen.
Fordi ROLLBACK TO lar transaksjonen vรฆre รฅpen, bestemmer du fortsatt pรฅ slutten om du vil UTFรRE de gjenvรฆrende endringene eller forkaste dem med en fullstendig ROLLBACK.
Hva er autonom transaksjon
I PL/SQL kalles alle modifikasjoner som gjรธres pรฅ data en transaksjon. En transaksjon anses som fullfรธrt nรฅr en lagring eller forkasting er angitt pรฅ den. Hvis ingen lagring eller forkasting er angitt, anses ikke transaksjonen som fullfรธrt, og modifikasjonene som er gjort pรฅ dataene vil ikke bli permanente pรฅ serveren.
Som standard behandler PL/SQL alle modifikasjonene i lรธpet av en รธkt som รฉn enkelt transaksjon, og lagring eller forkasting av den transaksjonen pรฅvirker alle ventende endringer i รธkten. En autonom transaksjon gir utvikleren muligheten til รฅ gjรธre endringer i en separat transaksjon og lagre eller forkaste den bestemte transaksjonen uten รฅ pรฅvirke hovedsesjonstransaksjonen.
- En autonom transaksjon kan spesifiseres pรฅ underprogramnivรฅ.
- ร lage noen delprogram fungerer i en annen transaksjon, bรธr nรธkkelordet PRAGMA AUTONOMOUS_TRANSACTION oppgis i den deklarative delen av den blokken.
- Den instruerer kompilatoren til รฅ behandle dette som en separat transaksjon, og lagring eller forkastelse i denne blokken vil ikke gjenspeiles i hovedtransaksjonen.
- Det er obligatorisk รฅ utstede COMMIT eller ROLLBACK fรธr man forlater denne autonome transaksjonen og gรฅr tilbake til hovedtransaksjonen, fordi bare รฉn transaksjon kan vรฆre aktiv til enhver tid.
- Sรฅ nรฅr en autonom transaksjon er startet, mรฅ den lagres og fullfรธres fรธr kontrollen kan gรฅ tilbake til hovedtransaksjonen.
Syntaks:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
I syntaksen ovenfor er blokken gjort til en autonom transaksjon.
Eksempel 1: I dette eksemplet skal vi forstรฅ hvordan en autonom transaksjon fungerer.
Skjermbildet nedenfor viser dette eksemplet pรฅ autonom transaksjon og resultatet 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;
Produksjon
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: Deklarerer nested_block-prosedyren.
- Code linje 4: Gjรธr nested_block-prosedyren til en AUTONOMOUS_TRANSACTION.
- Code linje 7โ9: รke lรธnnen for ansatt nummer 1002 med 15000.
- Code linje 10: Utfรธrer den autonome transaksjonen.
- Code linje 13โ16: Utskrift av lรธnnsdetaljene til ansatte 1001 og 1002 fรธr endringene.
- Code linje 17โ19: รke lรธnnen for ansatt nummer 1001 med 5000.
- Code linje 20: Kaller nested_block-prosedyren.
- Code linje 21: Forkaster hovedtransaksjonen.
- Code linje 22โ25: Utskrift av lรธnnsdetaljene til ansatte 1001 og 1002 etter endringene.
Lรธnnsรธkningen for ansatt nummer 1001 gjenspeiles ikke fordi hovedtransaksjonen er forkastet. Lรธnnsรธkningen for ansatt nummer 1002 gjenspeiles fordi den blokken er gjort til en separat transaksjon og lagret pรฅ slutten.
Sรฅ uavhengig av lagring eller forkastelse ved hovedtransaksjonen, lagres endringene i den autonome transaksjonen uten at det pรฅvirker hovedtransaksjonen.
Nรฅr skal man bruke autonome transaksjoner
Autonome transaksjoner er kraftige, sรฅ det hjelper รฅ vite nรฅr de passer. Reserver dem for arbeid som mรฅ lykkes eller mislykkes uavhengig av hovedtransaksjonen, ikke for kjernevirksomhetslogikk. Vanlige brukstilfeller inkluderer:
- Revisjonslogging: Registrer hvem som endret sensitive data, nรฅr, og de gamle og nye verdiene, slik at loggen bevares selv om hovedtransaksjonen rulles tilbake.
- Feillogging: Skriv en feiloppfรธring inni en unntak behandleren og COMMIT den, slik at diagnostikkdetaljene beholdes mens den mislykkede transaksjonen forkastes.
- Tellere og statistikk: Fremskynd en bruksteller eller treffteller som mรฅ vare uavhengig av innringerens utfall.
- COMMIT inne i en trigger: En trigger kan ikke utstede COMMIT direkte; en autonom transaksjon er den eneste stรธttede mรฅten รฅ gjรธre det pรฅ.
Unngรฅ autonome transaksjoner for vanlige oppdateringer som skal dele skjebnen med hovedtransaksjonen. Overbruk av dem kan skjule data bak uavhengige commits og gjรธre feilsรธking vanskeligere. Som regel mรฅ hver autonom blokk avsluttes med en eksplisitt COMMIT eller ROLLBACK.
Autonome vs. vanlige transaksjoner
Forskjellen mellom en vanlig (hoved)transaksjon og en autonom transaksjon kommer ned til omfang og uavhengighet. Tabellen nedenfor sammenligner dem.
| Aspekt | Vanlig transaksjon | Autonom transaksjon |
|---|---|---|
| Omfang | Deler รฉn รธkttransaksjon | Kjรธrer som en separat undertransaksjon |
| COMMIT / ROLLBACK-effekt | Pรฅvirker alle ventende รธktendringer | Pรฅvirker bare den autonome blokken |
| Erklรฆring | Standardoppfรธrsel | PRAGMA AUTONOM_TRANSAKSJON i den deklarative delen |
| Effekt av tilbakerulling av foreldre | Endringene gรฅr tapt | Forpliktede autonome endringer beholdes |
| Typisk bruk | Kjerneforretningslogikk | Revisjon og feillogging |
I motsetning til en vanlig nestet blokk, hvis endringer alltid deler resultatet av den omsluttende transaksjonen, stรฅr en autonom blokk pรฅ egenhรฅnd. ร forstรฅ denne forskjellen hjelper deg med รฅ bestemme nรฅr en blokk skal vรฆre uavhengig og nรฅr den skal dele resultatet av hovedtransaksjonen.

