Wat zijn TCL-verklaringen in PL / SQL?
TCL staat voor Transaction Control Statements. Het zal de lopende transacties opslaan of de lopende transactie terugdraaien. Deze instructies spelen de cruciale rol, want tenzij de transactie wordt opgeslagen, worden de wijzigingen via DML-instructies niet in de database opgeslagen. Hieronder staan de verschillende TCL-verklaringen.
COMMIT | Slaat alle lopende transacties op |
TERUGROLLEN | Gooi alle lopende transacties weg |
SAVEPOINT | Creëert een punt in de transactie tot waar het terugdraaien later kan worden gedaan |
ROLLBACK NAAR | Gooi alle lopende transacties weg tot het opgegeven |
De transactie zal worden voltooid onder de volgende scenario's.
- Wanneer een van de bovenstaande verklaringen wordt uitgegeven (behalve SAVEPOINT)
- Wanneer DDL-verklaringen worden uitgegeven. (DDL zijn instructies voor automatische vastlegging)
- WANNEER DCL-verklaringen worden uitgegeven. (DCL zijn instructies voor automatische vastlegging)
Wat is een autonome transactie
In PL / SQL worden alle wijzigingen die aan gegevens zijn aangebracht, een transactie genoemd. Een transactie wordt als voltooid beschouwd wanneer het opslaan / weggooien erop wordt toegepast. Als er geen save / discard wordt opgegeven, wordt de transactie niet als voltooid beschouwd en worden de wijzigingen aan de gegevens niet permanent gemaakt op de server.
Ongeacht enkele wijzigingen die tijdens een sessie zijn aangebracht, behandelt PL / SQL de hele wijziging als een enkele transactie en het opslaan / negeren van deze transactie heeft gevolgen voor alle lopende wijzigingen in die sessie. Autonome transactie biedt een functionaliteit voor de ontwikkelaar waarmee het wijzigingen in een afzonderlijke transactie kan aanbrengen en die specifieke transactie kan opslaan / verwijderen zonder de hoofdsessietransactie te beïnvloeden.
- Deze autonome transactie kan op subprogrammaniveau worden gespecificeerd.
- Om een subprogramma te laten werken in een andere transactie, moet het trefwoord 'PRAGMA AUTONOMOUS_TRANSATION' worden opgegeven in het declaratieve gedeelte van dat blok.
- Het zal die compiler instrueren om dit als de afzonderlijke transactie te behandelen en het opslaan / weggooien binnen dit blok zal niet worden weerspiegeld in de hoofdtransactie.
- Het uitgeven van COMMIT of ROLLBACK is verplicht voordat 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 gedaan, moeten we deze opslaan en de transactie voltooien, alleen kunnen we teruggaan naar de hoofdtransactie.
Syntaxis:
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[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.
DECLAREl_salary NUMBER;PROCEDURE nested_block ISPRAGMA autonomous_transaction;BEGINUPDATE empSET salary = salary + 15000WHERE emp_no = 1002;COMMIT;END;BEGINSELECT 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 empSET salary = salary + 5000WHERE 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;
Uitvoer
Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000
Code Verklaring:
- Coderegel 2 : l_salary declareren als NUMBER.
- Coderegel 3 : procedure voor geneste_blokkering declareren
- Coderegel 4 : geneste_blokprocedure maken als 'AUTONOMOUS_TRANSACTION'.
- Coderegel 7-9: Verhoging van het salaris voor werknemer nummer 1002 met 15.000.
- Coderegel 10: de transactie uitvoeren.
- Coderegel 13-16: Afdrukken van de salarisgegevens van werknemer 1001 en 1002 vóór wijzigingen.
- Coderegel 17-19: Salaris voor medewerker nummer 1001 verhogen met 5000.
- Coderegel 20: aanroepen van de procedure geneste_blokkering;
- Coderegel 21: Annuleren van de hoofdtransactie.
- Coderegel 22-25: Afdrukken van de salarisgegevens van werknemer 1001 en 1002 na wijzigingen.
- De salarisverhoging voor medewerker nummer 1001 wordt niet weergegeven omdat de hoofdtransactie is verworpen. De salarisverhoging voor medewerker nummer 1002 komt tot uiting doordat die blokkering als aparte transactie is gemaakt en aan het einde is opgeslagen.
- Dus ongeacht het opslaan / weggooien bij de hoofdtransactie, zijn de wijzigingen bij de autonome transactie opgeslagen zonder de belangrijkste transactiewijzigingen te beïnvloeden.