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