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