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.

  • ๐Ÿ’พ BEGร…: Gjรธr alle ventende DML-endringer permanente, avslutter transaksjonen, opphever lรฅser og sletter alle lagringspunkter.
  • โ†ฉ๏ธ TILBAKERULLING: Angrer ventende endringer, enten hele transaksjonen eller tilbake til et navngitt SAVEPOINT.
  • ๐Ÿ“Œ LAGREPOINT: Markerer et punkt i en transaksjon, slik at en senere ROLLBACK TO bare kan angre deler av arbeidet.
  • ๐Ÿ”€ Autonom transaksjon: PRAGMA AUTONOMOUS_TRANSACTION-direktivet lar et delprogram fullfรธre eller tilbakestille programmet pรฅ egenhรฅnd.
  • ๐Ÿงพ Bruk tilfeller: Autonome transaksjoner passer til revisjon og feillogging som mรฅ vedvare selv om hovedarbeidet rulles tilbake.
  • ๐Ÿค– AI-hjelp: AI-assistenter som GitHub Copilot utkaster COMMIT-, ROLLBACK- og PRAGMA-blokker og flagger manglende commits.

Autonom transaksjon i Oracle PL/SQL med COMMIT og ROLLBACK

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.

Eksempel pรฅ autonom transaksjon som begรฅr en nestet blokk mens hovedtransaksjonen rulles tilbake Oracle PL / SQL

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.

Spรธrsmรฅl og svar

Oracle hever ORA-06519 og ruller tilbake det autonome arbeidet. Hver autonom transaksjon mรฅ fullfรธres med en eksplisitt COMMIT eller ROLLBACK fรธr kontrollen gรฅr tilbake til hovedtransaksjonen, fordi bare รฉn aktiv transaksjon er tillatt om gangen.

Ikke direkte. En vanlig trigger kan ikke utstede COMMIT eller ROLLBACK. ร… deklarere triggeren, eller en prosedyre den kaller, med PRAGMA AUTONOMOUS_TRANSACTION lar den begi sine egne endringer uavhengig av setningen som utlรธste triggeren.

Nei. Nรฅr den overordnede transaksjonen er suspendert, kjรธrer den autonome transaksjonen uavhengig og kan ikke se den overordnede transaksjonens uregistrerte endringer. Den ser bare data som allerede er registrert i databasen, sรฅ det รฅ vente pรฅ en overordnet lรฅsing kan fรธre til en vranglรฅs.

Ja. Hver DDL-setning, som CREATE, ALTER eller DROP, utsteder en implisitt COMMIT fรธr og etter at den kjรธrer. Enhver ventende DML i รธkten blir automatisk commitert, sรฅ en DDL-setning kan ikke rulles tilbake etterpรฅ.

En autonom blokk kan kalle en annen, og hver av dem administrerer sin egen COMMIT eller ROLLBACK. Oracle setter en grense for hvor mange transaksjoner som er aktive samtidig gjennom initialiseringsparameteren TRANSACTIONS, slik at svรฆrt dyp nestering av autonome blokker kan mislykkes.

Nei. En COMMIT gjรธr endringer permanente, opphever lรฅser og sletter lagringspunkter, sรฅ den kan ikke angres med ROLLBACK. For รฅ angre lagrede data mรฅ du kjรธre en ny DML. Bruk SAVEPOINT og ROLLBACK TO for delvis angre fรธr du lagrer data.

Ja. GitHub Copilot utkaster COMMIT- og ROLLBACK-logikk, SAVEPOINT-blokker og PRAGMA AUTONOMOUS_TRANSACTION-prosedyrer fra en kommentar. Revse plasseringen av commit og feilhรฅndteringen, siden en feilplassert commit kan รธdelegge transaksjonsgrenser.

AI-assistenter skanner prosedyrer for manglende eller feilplasserte COMMIT- og ROLLBACK-setninger, commits inside loops og ulukkede autonome blokker. Denne maskinlรฆringsgjennomgangen flagger transaksjonsfeil og foreslรฅr tryggere grenser fรธr koden nรฅr produksjon.

Oppsummer dette innlegget med: