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.
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.
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.


