Що таке твердження TCL у PL / SQL?
TCL розшифровується як Заяви про контроль транзакцій. Це або збереже очікувані транзакції, або відкотить очікувану транзакцію. Ці оператори відіграють життєво важливу роль, оскільки, якщо транзакцію не збережено, зміни через оператори 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 відображається, оскільки цей блок було зроблено як окрему операцію та збережено в кінці.
- Отже, незалежно від збереження / скасування в основній транзакції, зміни в автономній транзакції були збережені, не впливаючи на основні зміни транзакції.