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: