Autonome transactie in Oracle PL / SQL

โšก Slimme samenvatting

Transactiecontrole-instructies in Oracle PL/SQL, met name COMMIT, ROLLBACK en SAVEPOINT, bepalen of DML-wijzigingen die nog in behandeling zijn, worden opgeslagen of verworpen. Een autonome transactie draait als een onafhankelijk subprogramma dat los van de hoofdtransactie commit of rollback uitvoert.

  • ๐Ÿ’พ VERBINDEN: Maakt alle lopende DML-wijzigingen permanent, beรซindigt de transactie, heft vergrendelingen op en wist alle opslagpunten.
  • ๏ธ TERUGDRAAIEN: Maakt lopende wijzigingen ongedaan, zowel de volledige transactie als een terugzetting naar een opgegeven opslagpunt.
  • ๐Ÿ“Œ OPSLAGPUNT: Hiermee wordt een punt binnen een transactie gemarkeerd, zodat een latere ROLLBACK TO slechts een deel van het werk ongedaan kan maken.
  • ๐Ÿ”€ Autonome transactie: De PRAGMA AUTONOMOUS_TRANSACTION-richtlijn zorgt ervoor dat een subprogramma zelfstandig een commit of rollback kan uitvoeren.
  • ๐Ÿงพ Gebruik Gevallen: Autonome transacties zijn geschikt voor audit- en foutregistratie die moet blijven bestaan, zelfs als de hoofdtaak wordt teruggedraaid.
  • ๐Ÿค– AI-assistentie: AI-assistenten zoals GitHub Copilot stellen COMMIT-, ROLLBACK- en PRAGMA-blokken op en signaleren ontbrekende commits.

Autonome transactie in Oracle PL/SQL met COMMIT en ROLLBACK

Wat zijn TCL-instructies in PL/SQL?

TCL staat voor Transaction Control Statements (transactiecontrole-instructies). Deze instructies slaan de lopende transacties op of draaien ze terug. Ze spelen een cruciale rol, want als een transactie niet wordt opgeslagen, blijven de wijzigingen die via TCL zijn aangebracht van kracht. DML-instructies wordt niet permanent in de database opgeslagen. Hieronder staan โ€‹โ€‹de verschillende TCL-instructies in PL / SQL.

Statement Beschrijving
COMMIT Slaat alle lopende transacties op.
TERUGROLLEN Alle lopende transacties worden geannuleerd.
OPSLAGPUNT Hiermee wordt een punt in de transactie gecreรซerd tot waar een terugdraaiing later kan worden uitgevoerd.
TERUG NAAR Verwijdert alle lopende transacties tot aan het opgegeven opslagpunt.

De transactie is voltooid onder de volgende omstandigheden:

  • Wanneer een van de bovenstaande verklaringen wordt afgegeven (behalve SAVEPOINT).
  • Wanneer DDL-instructies worden uitgegeven (DDL zijn auto-commit-instructies).
  • Wanneer DCL-statements worden uitgegeven (DCL's zijn auto-commit-statements).

Gebruik maken van SAVEPOINT en ROLLBACK TO

De bovenstaande tabel introduceert SAVEPOINT en ROLLBACK TO. Samen geven ze u gedeeltelijke controle over een transactie. Een SAVEPOINT markeert een benoemd punt binnen de huidige transactie. Een latere ROLLBACK TO naar dat savepoint maakt alle wijzigingen die erna zijn aangebracht ongedaan, terwijl een ROLLBACK TO de transactie behoudt.ping Het werk dat eraan voorafging, blijft intact.

Dit is handig wanneer een langdurige transactie meerdere acties uitvoert. SQL Je kunt de transactie stap voor stap afbreken, maar alleen de laatste stap mislukt. In plaats van de hele transactie te annuleren, kun je teruggaan naar het laatst succesvolle opslagpunt en verdergaan.

Syntax:

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

Belangrijke punten om te onthouden over savepoints:

  • Een savepoint bestaat alleen binnen de huidige transactie; een commit of een volledige rollback wist alle savepoints.
  • Wanneer je terugkeert naar een eerder opgeslagen spelstandpunt, worden alle daarna gemaakte opslagpunten verwijderd, maar het opslagpunt waarnaar je terugkeert, blijft behouden.
  • ROLLBACK TO beรซindigt de transactie niet; de wijzigingen die vรณรณr het opslagpunt zijn aangebracht, blijven in behandeling totdat u COMMIT of ROLLBACK uitvoert.
  • Als je een savepointnaam hergebruikt, verplaatst de nieuwere savepointnaam de markering naar de latere positie.

Omdat ROLLBACK TO de transactie open laat, beslis je uiteindelijk nog steeds of je de resterende wijzigingen wilt COMMITTEN of ze wilt terugdraaien met een volledige ROLLBACK.

Wat is autonome transactie

In PL/SQL worden alle wijzigingen die aan gegevens worden aangebracht een transactie genoemd. Een transactie wordt als voltooid beschouwd wanneer er een save- of discard-commando aan is gekoppeld. Als er geen save- of discard-commando wordt gegeven, wordt de transactie niet als voltooid beschouwd en worden de wijzigingen aan de gegevens niet permanent op de server opgeslagen.

Standaard behandelt PL/SQL alle wijzigingen tijdens een sessie als รฉรฉn transactie, en het opslaan of annuleren van die transactie heeft invloed op alle lopende wijzigingen in de sessie. Een autonome transactie biedt de ontwikkelaar de mogelijkheid om wijzigingen in een aparte transactie aan te brengen en die specifieke transactie op te slaan of te annuleren zonder de hoofdtransactie van de sessie te beรฏnvloeden.

  • Een autonome transactie kan op subprogrammaniveau worden gespecificeerd.
  • Om er een te maken subprogramma Om in een andere transactie te werken, moet het trefwoord PRAGMA AUTONOMOUS_TRANSACTION in het declaratiegedeelte van dat blok worden opgenomen.
  • Dit instrueert de compiler om dit als een aparte transactie te behandelen, en het opslaan of verwijderen binnen dit blok heeft geen invloed op de hoofdtransactie.
  • Het uitvoeren van een COMMIT- of ROLLBACK-opdracht is verplicht voordat u deze autonome transactie verlaat en terugkeert naar de hoofdtransactie, omdat er op elk moment slechts รฉรฉn transactie actief kan zijn.
  • Zodra een autonome transactie is gestart, moet deze worden opgeslagen en voltooid voordat de controle weer kan worden overgedragen aan de hoofdtransactie.

Syntax:

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

In de bovenstaande syntax is het blok een autonome transactie geworden.

Voorbeeld 1: In dit voorbeeld gaan we begrijpen hoe een autonome transactie werkt.

De onderstaande schermafbeelding toont dit voorbeeld van een autonome transactie en de bijbehorende uitvoer. Oracle.

Voorbeeld van een autonome transactie waarbij een genest blok wordt vastgelegd terwijl de hoofdtransactie wordt teruggedraaid. 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;

uitgang

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 Uitleg:

  • Code lijn 2: Het salaris van l_salary declareren als NUMMER.
  • Code lijn 3: De procedure nested_block declareren.
  • Code lijn 4: De geneste_blokprocedure een AUTONOMOUS_TRANSACTION maken.
  • Code regel 7-9: Verhoging van het salaris voor medewerker nummer 1002 met 15000.
  • Code lijn 10: De autonome transactie voltooien.
  • Code regel 13-16: Het afdrukken van de salarisgegevens van werknemers 1001 en 1002 vรณรณr de wijzigingen.
  • Code regel 17-19: Verhoging van het salaris voor medewerker nummer 1001 met 5000.
  • Code lijn 20: De geneste_blokprocedure aanroepen.
  • Code lijn 21: De hoofdtransactie weggooien.
  • Code regel 22-25: Het afdrukken van de salarisgegevens van werknemers 1001 en 1002 na de wijzigingen.

De salarisverhoging voor medewerker nummer 1001 wordt niet weergegeven omdat de hoofdtransactie is verwijderd. De salarisverhoging voor medewerker nummer 1002 wordt wel weergegeven omdat dit blok als een aparte transactie is aangemaakt en aan het einde is opgeslagen.

Ongeacht of de wijzigingen in de autonome transactie worden opgeslagen of verwijderd tijdens de hoofdtransactie, worden ze opgeslagen zonder de hoofdtransactie te beรฏnvloeden.

Wanneer moet je autonome transacties gebruiken?

Autonome transacties zijn krachtig, dus het is handig om te weten wanneer ze gepast zijn. Reserveer ze voor taken die onafhankelijk van de hoofdtransactie moeten slagen of mislukken, en niet voor de kernlogica van een bedrijf. Veelvoorkomende gebruiksscenario's zijn onder andere:

  • Auditregistratie: Leg vast wie gevoelige gegevens heeft gewijzigd, wanneer, en de oude en nieuwe waarden, zodat het logboek behouden blijft, zelfs als de hoofdtransactie wordt teruggedraaid.
  • Fout loggen: Schrijf een foutrecord binnen een uitzondering handler en COMMIT deze, zodat de diagnostische details behouden blijven terwijl de mislukte transactie wordt verworpen.
  • Tellers en statistieken: Verhoog een gebruiksteller of hit-teller die moet blijven bestaan, ongeacht de uitkomst van de oproep.
  • COMMIT binnen een trigger: Een trigger kan niet rechtstreeks een COMMIT-opdracht geven; een autonome transactie is de enige ondersteunde manier om dit te doen.

Vermijd autonome transacties voor gewone updates die hetzelfde lot moeten delen als de hoofdtransactie. Overmatig gebruik ervan kan gegevens achter onafhankelijke commits verbergen en debuggen bemoeilijken. In de regel moet elk autonoom blok eindigen met een expliciete COMMIT of ROLLBACK.

Autonome versus reguliere transacties

Het verschil tussen een reguliere (hoofd)transactie en een autonome transactie zit hem in de reikwijdte en onafhankelijkheid. De onderstaande tabel vergelijkt ze.

Aspect Regelmatige transactie Autonome transactie
strekking Deelt รฉรฉn sessietransactie Wordt uitgevoerd als een aparte subtransactie.
COMMIT / ROLLBACK-effect Heeft gevolgen voor alle lopende sessiewijzigingen. Heeft alleen gevolgen voor het autonome blok.
Verklaring Standaardgedrag PRAGMA AUTONOMOUS_TRANSACTION in het declaratieve gedeelte
Effect van terugdraaien van ouderfunctie Wijzigingen gaan verloren Doorgevoerde autonome wijzigingen worden bewaard.
Typisch gebruik Kernbedrijfslogica Audit- en foutenregistratie

Anders dan een gewone genest blokEen autonoom blok, waarvan de wijzigingen altijd de uitkomst van de omringende transactie delen, staat op zichzelf. Het begrijpen van dit verschil helpt je te bepalen wanneer een blok onafhankelijk moet zijn en wanneer het de uitkomst van de hoofdtransactie moet delen.

Veelgestelde vragen

Oracle Dit genereert ORA-06519 en draait het autonome werk terug. Elke autonome transactie moet eindigen met een expliciete COMMIT of ROLLBACK voordat de controle terugkeert naar de hoofdtransactie, omdat er slechts รฉรฉn actieve transactie tegelijk is toegestaan.

Niet direct. Een normale trigger kan geen COMMIT of ROLLBACK uitvoeren. Door de trigger, of een procedure die deze aanroept, te declareren met PRAGMA AUTONOMOUS_TRANSACTION, kan deze zijn eigen wijzigingen vastleggen, onafhankelijk van de instructie die de trigger heeft geactiveerd.

Nee. Zodra de oudertransactie is opgeschort, draait de autonome transactie onafhankelijk en kan deze de niet-vastgelegde wijzigingen van de oudertransactie niet zien. De autonome transactie ziet alleen gegevens die al in de database zijn vastgelegd, waardoor wachten op een vergrendeling van de oudertransactie een deadlock kan veroorzaken.

Ja. Elke DDL-instructie, zoals CREATE, ALTER of DROP, voert een impliciete COMMIT uit vรณรณr en na de uitvoering. Alle lopende DML-bewerkingen in de sessie worden automatisch gecommit, waardoor een DDL-instructie achteraf niet meer kan worden teruggedraaid.

Een autonoom blok kan een ander blok aanroepen, en elk blok beheert zijn eigen COMMIT of ROLLBACK. Oracle Het aantal gelijktijdig actieve transacties wordt beperkt door de initialisatieparameter TRANSACTIONS, waardoor zeer diepe nesting van autonome blokken kan mislukken.

Nee. Een COMMIT maakt wijzigingen permanent, heft vergrendelingen op en wist savepoints, waardoor deze niet ongedaan gemaakt kan worden met ROLLBACK. Om vastgelegde gegevens terug te draaien, moet u nieuwe DML-bewerkingen uitvoeren. Gebruik SAVEPOINT en ROLLBACK TO voor gedeeltelijke ongedaanmaking vรณรณr de commit.

Ja. GitHub-copiloot De code genereert concepten voor COMMIT- en ROLLBACK-logica, SAVEPOINT-blokken en PRAGMA AUTONOMOUS_TRANSACTION-procedures op basis van een opmerking. RevBekijk de plaatsing van de commit en de foutafhandeling, aangezien een verkeerd geplaatste commit de transactiegrenzen kan beschadigen.

AI-assistenten scannen procedures op ontbrekende of verkeerd geplaatste COMMIT- en ROLLBACK-instructies, commits binnen lussen en niet-afgesloten autonome blokken. Deze machine learning-controle signaleert transactiefouten en suggereert veiligere grenzen voordat de code in productie wordt genomen.

Vat dit bericht samen met: