Какво представляват TCL изявленията в PL / SQL?
TCL означава Transaction Control Statements. Той ще запази чакащите транзакции или ще върне чакащата транзакция. Тези изрази играят жизненоважна роля, защото освен ако транзакцията не бъде запазена, промените чрез DML изрази няма да бъдат записани в базата данни. По-долу са различните изявления на TCL.
АНГАЖИРАНЕ | Запазва цялата чакаща транзакция |
ВРЪЩАНЕ | Отхвърлете всички чакащи транзакции |
SAVEPOINT | Създава точка в транзакцията, до която връщането може да се извърши по-късно |
ВРЪЩАНЕ НА | Отхвърлете цялата чакаща транзакция до посочената <точка за запис> |
Транзакцията ще бъде завършена при следните сценарии.
- Когато е издадено някое от горните изявления (с изключение на SAVEPOINT)
- Когато се издават DDL извлечения. (DDL са изявления за автоматично фиксиране)
- КОГА се издават DCL извлечения. (DCL са изявления за автоматично фиксиране)
Какво е автономна транзакция
В PL / SQL всички модификации, извършени върху данните, ще бъдат наречени като транзакция. Транзакцията се счита за завършена, когато към нея се приложи записването / изхвърлянето. Ако не е дадено запазване / отхвърляне, тогава транзакцията няма да се счита за завършена и промените, извършени върху данните, няма да бъдат направени постоянни на сървъра.
Независимо от някои модификации, направени по време на сесия, PL / SQL ще третира цялата модификация като единична транзакция и запазването / отхвърлянето на тази транзакция се отразява на всички чакащи промени в тази сесия. Автономната транзакция предоставя функционалност на разработчика, в която позволява да се правят промени в отделна транзакция и да се запазва / отхвърля тази конкретна транзакция, без да се засяга основната транзакция на сесията.
- Тази автономна транзакция може да бъде посочена на ниво подпрограма.
- За да накара всяка подпрограма да работи в различна транзакция, ключовата дума „PRAGMA AUTONOMOUS_TRANSATION“ трябва да бъде дадена в декларативния раздел на този блок.
- Той ще инструктира компилаторът да третира това като отделна транзакция и запазването / изхвърлянето вътре в този блок няма да се отрази в основната транзакция.
- Издаването на COMMIT или ROLLBACK е задължително преди излизане от тази автономна транзакция към основната транзакция, тъй като по всяко време само една транзакция може да бъде активна.
- Така че след като направихме автономна транзакция, трябва да я запазим и завършим транзакцията, тогава само ние можем да се върнем към основната транзакция.
Синтаксис:
DECLAREPRAGMA AUTONOMOUS_TRANSACTION;.BEGIN[COMMIT|ROLLBACK]END;/
- В горния синтаксис блокът е направен като автономна транзакция.
Пример 1 : В този пример ще разберем как работи автономната транзакция.
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;
Изход
Before:Salary of 1001 is 15000Before:Salary of 1002 is 10000After:Salary of 1001 is 15000After:Salary of 1002 is 25000
Обяснение на кода:
- Код ред 2 : Деклариране на l_salary като НОМЕР.
- Кодов ред 3 : Деклариране на процедура nested_block
- Кодов ред 4 : Осъществяване на процедурата за вложен_блок като 'AUTONOMOUS_TRANSACTION'.
- Код ред 7-9: Увеличаване на заплатата за служител номер 1002 с 15000.
- Код ред 10: Ангажиране на транзакцията.
- Кодов ред 13-16: Отпечатване на данните за заплатата на служители 1001 и 1002 преди промени.
- Кодов ред 17-19: Увеличаване на заплатата за служител номер 1001 с 5000.
- Кодов ред 20: Извикване на процедурата nested_block;
- Кодов ред 21: Отхвърляне на основната транзакция.
- Кодов ред 22-25: Отпечатване на данните за заплатата на служители 1001 и 1002 след промени.
- Увеличението на заплатата за служител номер 1001 не се отразява, тъй като основната транзакция е отхвърлена. Увеличението на заплатата за служител номер 1002 е отразено, защото този блок е направен като отделна транзакция и е запазен в края.
- Така че независимо от запазването / изхвърлянето при основната транзакция промените при автономната транзакция са запазени, без да се засягат промените в основната транзакция.