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.

  • 💾 BEGÅ: Gør alle ventende DML-ændringer permanente, afslutter transaktionen, frigiver låse og sletter alle gemte punkter.
  • ↩️ TILBAGETRULNING: Fortryder ventende ændringer, enten hele transaktionen eller tilbage til et navngivet SAVEPOINT.
  • 📌 SAVEPOINT: Markerer et punkt i en transaktion, så en senere ROLLBACK TO kun kan fortryde en del af arbejdet.
  • 🔀 Autonom transaktion: PRAGMA AUTONOMOUS_TRANSACTION-direktivet lader et underprogram committe eller rollbacke på egen hånd.
  • 🧾 Brug sager: Autonome transaktioner er egnede til revision og fejllogning, der skal fortsætte, selvom hovedarbejdet rulles tilbage.
  • 🤖 AI Assistance: AI-assistenter som GitHub Copilot udkaster COMMIT-, ROLLBACK- og PRAGMA-blokke og markerer manglende commits.

Autonom transaktion i Oracle PL/SQL med COMMIT og ROLLBACK

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.

Eksempel på autonom transaktion, der committer en indlejret blok, mens hovedtransaktionen ruller tilbage 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;

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.

Ofte Stillede Spørgsmål

Oracle hæver ORA-06519 og ruller det autonome arbejde tilbage. Enhver autonom transaktion skal afsluttes med en eksplicit COMMIT eller ROLLBACK, før kontrollen vender tilbage til hovedtransaktionen, fordi kun én aktiv transaktion er tilladt ad gangen.

Ikke direkte. En normal trigger kan ikke udføre COMMIT eller ROLLBACK. Ved at deklarere triggeren, eller en procedure den kalder, med PRAGMA AUTONOMOUS_TRANSACTION, kan den committe sine egne ændringer uafhængigt af den sætning, der udløste triggeren.

Nej. Når den overordnede transaktion er suspenderet, kører den autonome transaktion uafhængigt og kan ikke se den overordnedes ikke-committede ændringer. Den ser kun data, der allerede er committet i databasen, så det kan forårsage en fastlåsning, hvis man venter på en overordnet låsning.

Ja. Hver DDL-sætning, såsom CREATE, ALTER eller DROP, udsteder en implicit COMMIT før og efter den kører. Enhver ventende DML i sessionen committes automatisk, så en DDL-sætning kan ikke rulles tilbage bagefter.

En autonom blok kan kalde en anden, og hver blok administrerer sin egen COMMIT eller ROLLBACK. Oracle begrænser antallet af aktive transaktioner på én gang via initialiseringsparameteren TRANSACTIONS, så meget dyb indlejring af autonome blokke kan mislykkes.

Nej. En COMMIT gør ændringer permanente, frigiver låse og sletter gemte punkter, så den kan ikke fortrydes med ROLLBACK. For at fortryde committede data skal du køre en ny DML. Brug SAVEPOINT og ROLLBACK TO til delvis fortrydelse før commit.

Ja. GitHub Copilot udkaster COMMIT- og ROLLBACK-logik, SAVEPOINT-blokke og PRAGMA AUTONOMOUS_TRANSACTION-procedurer fra en kommentar. RevSe commit-placeringen og fejlhåndteringen, da en forkert placeret commit kan ødelægge transaktionsgrænser.

AI-assistenter scanner procedurer for manglende eller forkert placerede COMMIT- og ROLLBACK-sætninger, commits inside loops og ikke-lukkede autonome blokke. Denne maskinlæringsgennemgang markerer transaktionsfejl og foreslår sikrere grænser, før koden når produktion.

Opsummer dette indlæg med: