Автономна транзакція в Oracle PL/SQL: фіксація, відкат

Що таке оператори TCL у PL/SQL?

TCL означає Transaction Control Statements. Це або збереже незавершені транзакції, або відкотить незавершену транзакцію. Ці оператори відіграють життєво важливу роль, оскільки, якщо транзакцію не буде збережено, зміни через оператори DML не будуть збережені в базі даних. Нижче наведено різні твердження TCL.

COMMIT Зберігає всі незавершені транзакції
ПОВЕРНЕННЯ Скасувати всі незавершені транзакції
ТОЧКА Збереження Створює точку в транзакції, до якої пізніше можна виконати відкат
ВІДКОТИТИСЯ НА Скасувати всі незавершені транзакції до вказаного

Транзакція буде завершена за наступними сценаріями.

  • Коли видається будь-яка з наведених вище заяв (крім SAVEPOINT)
  • Коли видаються заяви DDL. (DDL - це оператори автоматичної фіксації)
  • КОЛИ видаються виписки DCL. (DCL – це оператори автоматичної фіксації)

Що таке автономна транзакція

У PL/SQL усі зміни, внесені до даних, будуть називатися транзакцією. Транзакція вважається завершеною, якщо до неї застосовано збереження/скидання. Якщо збереження/скидання не надано, транзакція не вважатиметься завершеною, а зміни, внесені до даних, не будуть постійними на сервері.

Незалежно від деяких змін, зроблених під час сеансу, PL / SQL розглядатиме всю модифікацію як одну транзакцію, а збереження/скасування цієї транзакції вплине на всі незавершені зміни в цьому сеансі. Автономна транзакція надає розробнику функціональність, у якій вона дозволяє вносити зміни в окрему транзакцію та зберігати/відкидати цю конкретну транзакцію, не впливаючи на транзакцію основного сеансу.

  • Цю автономну транзакцію можна вказати на рівні підпрограми.
  • Щоб змусити будь-яку підпрограму працювати в іншій транзакції, ключове слово "PRAGMA AUTONOMOUS_TRANSATION" слід вказати в декларативному розділі цього блоку.
  • Він накаже компілятору розглядати це як окрему транзакцію, а збереження/відкидання всередині цього блоку не відображатиметься в основній транзакції.
  • Видача COMMIT або ROLLBACK є обов’язковою перед переходом від цієї автономної транзакції до основної транзакції, оскільки в будь-який час може бути активною лише одна транзакція.
  • Отже, коли ми зробили автономну транзакцію, нам потрібно зберегти її та завершити транзакцію, лише тоді ми зможемо повернутися до основної транзакції.

Синтаксис:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • У наведеному вище синтаксисі блок створено як автономну транзакцію.

Приклад 1: У цьому прикладі ми збираємося зрозуміти, як працює автономна транзакція.

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;

Вихід

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Автономна транзакція

Пояснення коду:

  • Рядок коду 2: оголошення l_salary як NUMBER.
  • Рядок коду 3: Оголошення процедури nested_block
  • Рядок коду 4: створення процедури nested_block як '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 відображено, оскільки цей блок було створено як окрему транзакцію та збережено в кінці.
  • Таким чином, незалежно від збереження/відмови під час основної транзакції, зміни в автономній транзакції було збережено без впливу на зміни основної транзакції.