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

Содержание:

Anonim

Что такое операторы 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 : Создание процедуры 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 отражено, потому что этот блок был выполнен как отдельная транзакция и сохранен в конце.
  • Таким образом, независимо от сохранения / сброса в основной транзакции, изменения в автономной транзакции были сохранены без влияния на основные изменения транзакции.