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

Что такое операторы TCL в PL/SQL?

TCL означает «Заявки управления транзакциями». Он либо сохранит ожидающие транзакции, либо откатит ожидающую транзакцию. Эти операторы играют жизненно важную роль, поскольку, если транзакция не будет сохранена, изменения, сделанные с помощью операторов 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 отражается, поскольку этот блок был создан как отдельная транзакция и сохранен в конце.
  • Таким образом, независимо от сохранения/отмены в основной транзакции изменения в автономной транзакции сохраняются, не затрагивая изменения основной транзакции.