Autonome transactie in Oracle PL/SQL: vastleggen, terugdraaien

Wat zijn TCL-instructies in PL/SQL?

TCL staat voor Transaction Control Statements. Het slaat de lopende transacties op of draait de lopende transactie terug. Deze verklaringen spelen een cruciale rol, want tenzij de transactie wordt opgeslagen, worden de wijzigingen via DML-verklaringen niet in de database opgeslagen. Hieronder staan ​​de verschillende TCL-verklaringen.

COMMIT Slaat alle lopende transacties op
TERUGROLLEN Gooi alle openstaande transacties weg
OPSLAGPUNT Creëert een punt in de transactie tot waar later kan worden teruggedraaid
TERUG NAAR Gooi alle openstaande transacties weg tot het opgegeven tijdstip

De transactie zal worden voltooid in de volgende scenario's.

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

Wat is autonome transactie

In PL/SQL worden alle wijzigingen aan gegevens een transactie genoemd. Een transactie wordt als voltooid beschouwd wanneer de optie opslaan/weggooien erop wordt toegepast. Als er geen opslag/verwijdering wordt gegeven, wordt de transactie niet als voltooid beschouwd en worden de wijzigingen aan de gegevens niet permanent op de server gemaakt.

Ongeacht enkele wijzigingen die tijdens een sessie worden aangebracht, PL / SQL behandelt de hele wijziging als een enkele transactie en het opslaan/verwijderen van deze transactie heeft gevolgen voor alle lopende wijzigingen in die sessie. Autonomous Transaction biedt de ontwikkelaar een functionaliteit waarmee wijzigingen in een afzonderlijke transactie kunnen worden aangebracht en die specifieke transactie kan worden opgeslagen/verwijderd zonder de hoofdsessietransactie te beïnvloeden.

  • Deze autonome transactie kan op subprogrammaniveau worden gespecificeerd.
  • Om een ​​subprogramma in een andere transactie te laten werken, moet het trefwoord 'PRAGMA AUTONOMOUS_TRANSATION' in het declaratieve gedeelte van dat blok worden opgegeven.
  • Het zal de compiler instrueren om dit als de afzonderlijke transactie te behandelen en het opslaan/weggooien binnen dit blok zal niet in de hoofdtransactie worden weerspiegeld.
  • Het uitvoeren van COMMIT of ROLLBACK is verplicht voordat u van deze autonome transactie naar de hoofdtransactie gaat, omdat er op elk moment slechts één transactie actief kan zijn.
  • Dus zodra we een autonome transactie hebben uitgevoerd, moeten we deze opslaan en de transactie voltooien. Alleen dan kunnen we teruggaan naar de hoofdtransactie.

Syntax:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • In de bovenstaande syntaxis is het blok gemaakt als een autonome transactie.

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

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

Autonome transactie

Code Verklaring:

  • Coderegel 2: l_salary declareren als NUMBER.
  • Coderegel 3: Geneste_blokprocedure declareren
  • Coderegel 4: Geneste_blokprocedure maken als 'AUTONOMOUS_TRANSACTION'.
  • Coderegel 7-9: Verhoging van het salaris voor medewerker nummer 1002 met 15000.
  • Coderegel 10: Het plegen van de transactie.
  • Coderegel 13-16: Afdrukken van de salarisgegevens van werknemer 1001 en 1002 vóór wijzigingen.
  • Coderegel 17-19: Verhoging van het salaris voor medewerker nummer 1001 met 5000.
  • Coderegel 20: Het aanroepen van de geneste_block-procedure;
  • Coderegel 21: De hoofdtransactie weggooien.
  • Coderegel 22-25: Salarisgegevens van werknemer 1001 en 1002 afdrukken na wijzigingen.
  • De salarisverhoging voor medewerker nummer 1001 wordt niet weergegeven omdat de hoofdtransactie is weggegooid. De salarisverhoging voor medewerker nummer 1002 komt tot uiting doordat dat blok als aparte transactie is gemaakt en uiteindelijk is opgeslagen.
  • Dus ongeacht het opslaan/weggooien bij de hoofdtransactie zijn de wijzigingen bij de autonome transactie opgeslagen zonder de wijzigingen in de hoofdtransactie te beïnvloeden.