Autonom transaktion in Oracle PL/SQL: Commit, Rollback
Vad är TCL-uttalanden i PL/SQL?
TCL står för Transaction Control Statements. Det kommer antingen att spara de pågående transaktionerna eller återställa den pågående transaktionen. Dessa uttalanden spelar den avgörande rollen eftersom om inte transaktionen sparas kommer ändringarna genom DML-satser inte att sparas i databasen. Nedan finns de olika TCL-satserna.
BEGÅ | Sparar alla pågående transaktioner |
RULLA TILLBAKA | Släng alla pågående transaktioner |
SPARA PUNKT | Skapar en punkt i transaktionen till vilken återställning kan göras senare |
ÅTERBAKA TILL | Släng alla väntande transaktioner tills den angivna |
Transaktionen kommer att slutföras under följande scenarier.
- När något av ovanstående uttalanden utfärdas (förutom SAVEPOINT)
- När DDL-utlåtanden utfärdas. (DDL är auto-commit-satser)
- NÄR DCL-utlåtanden utfärdas. (DCL är auto-commit uttalanden)
Vad är autonom transaktion
I PL/SQL kommer alla ändringar som görs på data att betecknas som en transaktion. En transaktion anses vara avslutad när spara/kassera tillämpas på den. Om ingen spara/kassera ges, kommer transaktionen inte att betraktas som fullständig och ändringarna som görs på data kommer inte att göras permanenta på servern.
Oavsett vissa ändringar som görs under en session, PL / SQL kommer att behandla hela ändringen som en enda transaktion och att spara/kassera denna transaktion påverkar hela väntande ändringar i den sessionen. Autonoma transaktioner tillhandahåller en funktion för utvecklaren där den tillåter att göra ändringar i en separat transaktion och att spara/kassera den specifika transaktionen utan att påverka huvudsessionstransaktionen.
- Denna autonoma transaktion kan specificeras på underprogramnivå.
- För att få ett underprogram att fungera i en annan transaktion, bör nyckelordet 'PRAGMA AUTONOMOUS_TRANSATION' anges i den deklarativa delen av blocket.
- Den kommer att instruera kompilatorn att behandla detta som den separata transaktionen och att spara/kassera i detta block kommer inte att återspeglas i huvudtransaktionen.
- Utfärdande av COMMIT eller ROLLBACK är obligatoriskt innan du går ut från denna autonoma transaktion till huvudtransaktionen eftersom endast en transaktion kan vara aktiv när som helst.
- Så när vi väl har gjort en autonom transaktion måste vi spara den och slutföra transaktionen då är det bara vi som kan gå tillbaka till huvudtransaktionen.
Syntax:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <executin_part> [COMMIT|ROLLBACK] END; /
- I ovanstående syntax har blocket gjorts som en autonom transaktion.
Exempelvis 1: I det här exemplet kommer vi att förstå hur den autonoma transaktionen fungerar.
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
Kodförklaring:
- Kodrad 2: Deklarerar l_lön som NUMBER.
- Kodrad 3: Deklarerar proceduren för kapslad_block
- Kodrad 4: Gör proceduren Nestd_block som 'AUTONOMOUS_TRANSACTION'.
- Kodrad 7-9: Öka lönen för anställd nummer 1002 med 15000.
- Kodrad 10: Begå transaktionen.
- Kodrad 13-16: Utskrift av löneuppgifter för anställd 1001 och 1002 före ändringar.
- Kodrad 17-19: Öka lönen för anställd nummer 1001 med 5000.
- Kodrad 20: Anropar proceduren nested_block;
- Kodrad 21: Kasta huvudtransaktionen.
- Kodrad 22-25: Utskrift av löneuppgifter för medarbetare 1001 och 1002 efter ändringar.
- Löneökningen för anställd nummer 1001 återspeglas inte eftersom huvudtransaktionen har kasserats. Löneökningen för anställd nummer 1002 återspeglas eftersom den spärren har gjorts som en separat transaktion och sparats i slutet.
- Så oberoende av spara/kassera vid huvudtransaktionen har ändringarna vid autonom transaktion sparats utan att påverka huvudtransaktionsändringarna.