Autonom transaktion in Oracle PL / SQL

โšก Smart sammanfattning

Transaktionskontrollutlรฅtanden i Oracle PL/SQL, nรคmligen COMMIT, ROLLBACK och SAVEPOINT, avgรถr om vรคntande DML-รคndringar sparas eller ignoreras. En autonom transaktion kรถrs som ett oberoende delprogram som committar eller รฅterstรคller รคndringarna separat frรฅn huvudtransaktionen.

  • ๐Ÿ’พ BEGร…: Gรถr alla vรคntande DML-รคndringar permanenta, avslutar transaktionen, frigรถr lรฅs och raderar alla sparpunkter.
  • โ†ฉ๏ธ ร…TERUPPRULLNING: ร…ngrar pรฅgรฅende รคndringar, antingen hela transaktionen eller tillbaka till en namngiven SAVEPOINT.
  • ๐Ÿ“Œ Rรคddningspunkt: Markerar en punkt inuti en transaktion sรฅ att en senare ROLLBACK TO bara kan รฅngra en del av arbetet.
  • ๐Ÿ”€ Autonom transaktion: Direktivet PRAGMA AUTONOMOUS_TRANSACTION lรฅter ett delprogram committa eller รฅterstรคlla programmet pรฅ egen hand.
  • ๐Ÿงพ Anvรคnd fall: Autonoma transaktioner passar fรถr revision och felloggning som mรฅste bestรฅ รคven om huvudarbetet รฅterstรคlls.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter som GitHub Copilot utkastar COMMIT-, ROLLBACK- och PRAGMA-block och flaggar saknade commits.

Autonom transaktion in Oracle PL/SQL med COMMIT och ROLLBACK

Vad รคr TCL-uttalanden i PL/SQL?

TCL stรฅr fรถr Transaction Control Statements (Transaction Control Statements). Dessa satser sparar antingen vรคntande transaktioner eller รฅterstรคller dem. De spelar en viktig roll, eftersom om inte en transaktion sparas kommer de รคndringar som gjorts genom... DML uttalanden kommer inte att lagras permanent i databasen. Nedan fรถljer de olika TCL-satserna i PL / SQL.

. BESKRIVNING
BEGร… Sparar alla pรฅgรฅende transaktioner.
RULLA TILLBAKA Ignorerar alla pรฅgรฅende transaktioner.
SPARA PUNKT Skapar en punkt i transaktionen fram till vilken en rollback kan gรถras senare.
ร…TERBAKA TILL Ignorerar alla vรคntande transaktioner upp till den angivna sparpunkten.

Transaktionen kommer att slutfรถras under fรถljande scenarier:

  • Nรคr nรฅgot av ovanstรฅende uttalanden utfรคrdas (fรถrutom SAVEPOINT).
  • Nรคr DDL-satser utfรคrdas (DDL รคr auto-commit-satser).
  • Nรคr DCL-uttryck utfรคrdas (DCL รคr auto-commit-uttryck).

Anvรคnda SAVEPOINT och ROLLBACK TO

Tabellen ovan introducerar SPARPUNKT och ร…TERGร…NG TILL, och tillsammans ger de dig delvis kontroll รถver en transaktion. En SPARPUNKT markerar en namngiven punkt inuti den aktuella transaktionen. En senare ร…TERGร…NG TILL den sparpunkten รฅngrar alla รคndringar som gjorts efter den, medanping arbetet som utfรถrts innan det intakt.

Detta รคr anvรคndbart nรคr en lรฅng transaktion utfรถr flera SQL steg och endast det sista steget misslyckas. Istรคllet fรถr att ignorera hela transaktionen kan du รฅtergรฅ till den senaste fungerande sparpunkten och fortsรคtta.

Syntax:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Viktiga punkter att komma ihรฅg om sparpunkter:

  • En SAVEPOINT finns bara inom den aktuella transaktionen; en COMMIT eller en fullstรคndig ROLLBACK raderar alla savepoints.
  • Nรคr du รฅtergรฅr till en sparpunkt raderas alla sparpunkter som skapats efter den, men sparpunkten du รฅtergรฅr till behรฅlls.
  • ROLLBACK TO avslutar inte transaktionen; รคndringar som gjordes fรถre sparpunkten fรถrblir vรคntande tills du COMMIT eller ROLLBACK.
  • Om du รฅteranvรคnder ett namn pรฅ en sparpunkt flyttar den nyare SAVEPOINT-markรถren till den senare positionen.

Eftersom ROLLBACK TO lรคmnar transaktionen รถppen bestรคmmer du fortfarande i slutet om du ska COMMIT de รฅterstรฅende รคndringarna eller ignorera dem med en fullstรคndig ROLLBACK.

Vad รคr autonom transaktion

I PL/SQL kallas alla modifieringar som gรถrs pรฅ data fรถr en transaktion. En transaktion anses vara slutfรถrd nรคr en "save" eller "discard" har angetts fรถr den. Om ingen "save" eller "discard" har angetts anses transaktionen inte vara slutfรถrd, och de modifieringar som gjorts pรฅ data kommer inte att gรถras permanenta pรฅ servern.

Som standard behandlar PL/SQL alla รคndringar under en session som en enda transaktion, och att spara eller ignorera den transaktionen pรฅverkar alla vรคntande รคndringar i sessionen. En autonom transaktion ger utvecklaren mรถjlighet att gรถra รคndringar i en separat transaktion och att spara eller ignorera den specifika transaktionen utan att pรฅverka huvudsessionstransaktionen.

  • En autonom transaktion kan specificeras pรฅ underprogramnivรฅ.
  • Att gรถra nรฅgon delprogram fungerar i en annan transaktion, bรถr nyckelordet PRAGMA AUTONOMOUS_TRANSACTION anges i den deklarativa delen av det blocket.
  • Den instruerar kompilatorn att behandla detta som en separat transaktion, och att spara eller kassera inuti detta block kommer inte att รฅterspeglas i huvudtransaktionen.
  • Det รคr obligatoriskt att utfรคrda COMMIT eller ROLLBACK innan man lรคmnar denna autonoma transaktion och รฅtergรฅr till huvudtransaktionen, eftersom endast en transaktion kan vara aktiv รฅt gรฅngen.
  • Sรฅ nรคr en autonom transaktion har startats mรฅste den sparas och slutfรถras innan kontrollen kan รฅtergรฅ till huvudtransaktionen.

Syntax:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

I ovanstรฅende syntax har blocket gjorts till en autonom transaktion.

Exempel 1: I det hรคr exemplet ska vi fรถrstรฅ hur en autonom transaktion fungerar.

Skรคrmdumpen nedan visar detta exempel pรฅ autonoma transaktioner och dess utdata i Oracle.

Exempel pรฅ autonom transaktion dรคr ett kapslat block genomfรถrs medan huvudtransaktionen รฅterstรคlls 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 Fรถrklaring:

  • Code rad 2: Deklarerar l_salary som NUMBER.
  • Code rad 3: Deklarerar proceduren nested_block.
  • Code rad 4: Gรถra nested_block-proceduren till en AUTONOMOUS_TRANSACTION.
  • Code rad 7-9: ร–ka lรถnen fรถr anstรคlld nummer 1002 med 15000.
  • Code rad 10: Genomfรถr den autonoma transaktionen.
  • Code rad 13-16: Utskrift av lรถneuppgifter fรถr anstรคllda 1001 och 1002 fรถre รคndringarna.
  • Code rad 17-19: ร–ka lรถnen fรถr anstรคlld nummer 1001 med 5000.
  • Code rad 20: Anropar proceduren nested_block.
  • Code rad 21: Kasta huvudtransaktionen.
  • Code rad 22-25: Utskrift av lรถneuppgifter fรถr anstรคllda 1001 och 1002 efter รคndringarna.

Lรถneรถkningen fรถr anstรคlld nummer 1001 รฅterspeglas inte eftersom huvudtransaktionen har ignorerats. Lรถneรถkningen fรถr anstรคlld nummer 1002 รฅterspeglas eftersom det blocket har gjorts till en separat transaktion och sparats i slutet.

Sรฅ oavsett om du sparar eller ignorerar vid huvudtransaktionen sparas รคndringarna i den autonoma transaktionen utan att pรฅverka huvudtransaktionen.

Nรคr man ska anvรคnda autonoma transaktioner

Autonoma transaktioner รคr kraftfulla, sรฅ det รคr bra att veta nรคr de passar. Reservera dem fรถr arbete som mรฅste lyckas eller misslyckas oberoende av huvudtransaktionen, inte fรถr kรคrnverksamhetens logik. Vanliga anvรคndningsomrรฅden inkluderar:

  • Granskningsloggning: Registrera vem som รคndrade kรคnsliga data, nรคr, och de gamla och nya vรคrdena, sรฅ att loggen finns kvar รคven om huvudtransaktionen รฅterstรคlls.
  • Felloggning: Skriv en felpost inuti en undantag hanteraren och COMMIT den, sรฅ att diagnosdetaljerna behรฅlls medan den misslyckade transaktionen ignoreras.
  • Rรคknare och statistik: Flytta fram en anvรคndningsrรคknare eller trรคffrรคknare som mรฅste behรฅllas oavsett uppringarens resultat.
  • COMMIT inuti en trigger: En trigger kan inte utfรคrda COMMIT direkt; en autonom transaktion รคr det enda sรคttet som stรถds att gรถra det.

Undvik autonoma transaktioner fรถr vanliga uppdateringar som ska dela samma รถde som huvudtransaktionen. ร–veranvรคndning av dem kan dรถlja data bakom oberoende commits och gรถra felsรถkning svรฅrare. Som regel mรฅste varje autonomt block avslutas med en explicit COMMIT eller ROLLBACK.

Autonoma kontra regelbundna transaktioner

Skillnaden mellan en vanlig (huvud)transaktion och en autonom transaktion handlar om omfattning och oberoende. Tabellen nedan jรคmfรถr dem.

Aspect Regelbunden transaktion Autonom transaktion
Omfattning Delar en sessionstransaktion Kรถrs som en separat undertransaktion
COMMIT / ROLLBACK-effekt Pรฅverkar alla vรคntande sessionsรคndringar Pรฅverkar endast det autonoma blocket
Fรถrklaring Standardbeteende PRAGMA AUTONOM_TRANSAKTION i det deklarativa avsnittet
Effekt av fรถrรคldraรฅterstรคllning ร„ndringarna gรฅr fรถrlorade Beslutna autonoma รคndringar behรฅlls
Typisk anvรคndning Kรคrnverksamhetens logik Revision och felloggning

Till skillnad frรฅn en vanlig kapslade block, vars รคndringar alltid delar resultatet av den omslutande transaktionen, stรฅr ett autonomt block pรฅ egen hand. Att fรถrstรฅ denna skillnad hjรคlper dig att avgรถra nรคr ett block ska vara oberoende och nรคr det ska dela resultatet av huvudtransaktionen.

Vanliga frรฅgor

Oracle hรถjer ORA-06519 och รฅterstรคller det autonoma arbetet. Varje autonom transaktion mรฅste avslutas med en explicit COMMIT eller ROLLBACK innan kontrollen รฅtergรฅr till huvudtransaktionen, eftersom endast en aktiv transaktion รคr tillรฅten รฅt gรฅngen.

Inte direkt. En vanlig trigger kan inte utfรคrda COMMIT eller ROLLBACK. Att deklarera triggern, eller en procedur den anropar, med PRAGMA AUTONOMOUS_TRANSACTION lรฅter den genomfรถra sina egna รคndringar oberoende av den sats som utlรถste triggern.

Nej. Nรคr fรถrรคldern รคr pausad kรถrs den autonoma transaktionen oberoende och kan inte se fรถrรคlderns obekrรคftade รคndringar. Den ser bara data som redan har bekrรคftats i databasen, sรฅ att vรคnta pรฅ ett fรถrรคlderlรฅs kan orsaka ett dรถdlรคge.

Ja. Varje DDL-sats, som CREATE, ALTER eller DROP, utfรคrdar en implicit COMMIT fรถre och efter att den kรถrs. Alla vรคntande DML i sessionen committeras automatiskt, sรฅ en DDL-sats kan inte rullas tillbaka efterรฅt.

Ett autonomt block kan anropa ett annat, och varje block hanterar sin egen COMMIT eller ROLLBACK. Oracle begrรคnsar hur mรฅnga transaktioner som รคr aktiva samtidigt genom initialiseringsparametern TRANSACTIONS, sรฅ mycket djup kapsling av autonoma block kan misslyckas.

Nej. En COMMIT gรถr รคndringar permanenta, frigรถr lรฅs och raderar sparpunkter, sรฅ den kan inte รฅngras med ROLLBACK. Fรถr att รฅterstรคlla inlagd data mรฅste du kรถra en ny DML. Anvรคnd SAVEPOINT och ROLLBACK TO fรถr delvis รฅngra innan du inlaggar.

Ja. GitHub Copilot skapar utkast till COMMIT- och ROLLBACK-logik, SAVEPOINT-block och PRAGMA AUTONOMOUS_TRANSACTION-procedurer frรฅn en kommentar. Revvisa commit-placeringen och felhanteringen, eftersom en felplacerad commit kan korrumpera transaktionsgrรคnser.

AI-assistenter skannar procedurer efter saknade eller felplacerade COMMIT- och ROLLBACK-satser, commits inuti loopar och oavslutade autonoma block. Denna maskininlรคrningsgranskning flaggar transaktionsfel och fรถreslรฅr sรคkrare grรคnser innan koden nรฅr produktion.

Sammanfatta detta inlรคgg med: