Autonom transaktion i Oracle PL/SQL: Commit, Rollback
Hvad er TCL-erklæringer i PL/SQL?
TCL står for Transaction Control Statements. Det vil enten gemme de afventende transaktioner eller rulle den afventende transaktion tilbage. Disse udsagn spiller den afgørende rolle, for medmindre transaktionen gemmes, vil ændringerne gennem DML-udsagn ikke blive gemt i databasen. Nedenfor er de forskellige TCL-sætninger.
COMMIT | Gemmer alle afventende transaktioner |
RULBACK | Kassér alle afventende transaktioner |
SAVEPOINT | Opretter et punkt i transaktionen, hvortil tilbagerulning kan foretages senere |
TILBAGE TIL | Kassér alle afventende transaktioner indtil den specificerede |
Transaktionen vil blive gennemført under følgende scenarier.
- Når nogen af ovenstående erklæringer udstedes (undtagen SAVEPOINT)
- Når der udstedes DDL-erklæringer. (DDL er auto-commit-udsagn)
- NÅR DCL-erklæringer udstedes. (DCL er auto-commit-udsagn)
Hvad er autonom transaktion
I PL/SQL vil alle de ændringer, der er foretaget på data, blive betegnet som en transaktion. En transaktion betragtes som afsluttet, når gem/kassering anvendes på den. Hvis der ikke gives nogen gem/kasser, vil transaktionen ikke blive betragtet som fuldstændig, og ændringerne på dataene vil ikke blive gjort permanente på serveren.
Uanset nogle ændringer foretaget under en session, PL / SQL vil behandle hele ændringen som en enkelt transaktion, og at gemme/kassere denne transaktion påvirker hele de afventende ændringer i den pågældende session. Autonome transaktioner giver udvikleren en funktionalitet, hvor den tillader at foretage ændringer i en separat transaktion og at gemme/kassere den pågældende transaktion uden at påvirke hovedsessionstransaktionen.
- Denne autonome transaktion kan specificeres på underprogramniveau.
- For at få et hvilket som helst underprogram til at fungere i en anden transaktion, skal nøgleordet 'PRAGMA AUTONOMOUS_TRANSATION' angives i den deklarative sektion af den pågældende blok.
- Den vil instruere kompilatoren til at behandle dette som den separate transaktion, og lagring/kassering inde i denne blok vil ikke afspejles i hovedtransaktionen.
- Udstedelse af COMMIT eller ROLLBACK er obligatorisk, før du går ud af denne autonome transaktion til hovedtransaktionen, fordi kun én transaktion til enhver tid kan være aktiv.
- Så når vi først har lavet en autonom transaktion, skal vi gemme den og fuldføre transaktionen, så er det kun vi, der kan gå tilbage til hovedtransaktionen.
Syntaks:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- I ovenstående syntaks er blokeringen foretaget som en autonom transaktion.
Eksempel 1: I dette eksempel skal vi forstå, hvordan den autonome transaktion fungerer.
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
Kodeforklaring:
- Kodelinje 2: Erklærer l_løn som NUMBER.
- Kodelinje 3: Erklærer indlejret_blok-procedure
- Kodelinje 4: Gør indlejret_blok-procedure som 'AUTONOMOUS_TRANSACTION'.
- Kodelinje 7-9: Forhøjelse af lønnen for medarbejder nummer 1002 med 15000.
- Kodelinje 10: Forpligtelse af transaktionen.
- Kodelinje 13-16: Udskrivning af lønoplysninger for medarbejder 1001 og 1002 før ændringer.
- Kodelinje 17-19: Forhøjelse af lønnen for medarbejder nummer 1001 med 5000.
- Kodelinje 20: Kalder proceduren indlejret_blok;
- Kodelinje 21: Kassering af hovedtransaktionen.
- Kodelinje 22-25: Udskrivning af lønoplysninger for medarbejder 1001 og 1002 efter ændringer.
- Lønstigningen for medarbejder nummer 1001 afspejles ikke, fordi hovedtransaktionen er kasseret. Lønstigningen for medarbejder nummer 1002 afspejles, fordi den blokering er foretaget som en separat transaktion og gemt til sidst.
- Så uanset gem/kasser ved hovedtransaktion er ændringerne ved autonom transaktion blevet gemt uden at påvirke de vigtigste transaktionsændringer.