Что такое TCL-операторы в PL / SQL?
Операторы TCL означает используются для контроля транзакций в базе данных Oracle. Такой оператор либо сохранит ожидающие транзакции (Commit
), либо откатит ожидающую транзакцию (Rollback
). Эти операторы играют жизненно важную роль, потому что, если транзакция не сохранена, изменения через операторы DML не будут сохранены в базе данных. Ниже приведены различные операторы TCL.
| Сохраняет все ожидающие (pending) транзакции |
| Отменяет все ожидающие транзакции |
| Создает контрольную точку в транзакции, до которой откат может быть выполнен позже |
| Отменить все ожидающие транзакции до указанной |
Транзакция будет завершена в следующих сценариях.
- Когда выдается какое-либо из вышеуказанных утверждений (кроме
SAVEPOINT
) - Когда выдаются заявления DDL. (DDL - операторы автоматической фиксации)
- Когда выдаются заявления DCL. (DCL - операторы автоматической фиксации)
Что такое автономная транзакция
В PL / SQL все изменения, сделанные в данных, будут называться транзакцией. Транзакция считается завершенной, когда к ней применено сохранение (Commit
) / сброс (Rollback
). Если сохранение / удаление не задано, транзакция не будет считаться завершенной, и изменения, внесенные в данные, не будут выполнены на сервере на постоянной основе (не будут зафиксированными в базе).
Независимо от некоторых модификаций, выполненных во время сеанса, PL / SQL будет рассматривать всю модификацию как одну транзакцию, а сохранение / отмена этой транзакции влияет на все ожидающие изменения в этом сеансе. Автономная транзакция предоставляет функциональность разработчику, в которой она позволяет вносить изменения в отдельную транзакцию и сохранять / отменять эту конкретную транзакцию, не затрагивая основную транзакцию сеанса.
Свойства автономных транзакций
- Автономная транзакция может быть указана на уровне подпрограммы.
- Чтобы любая подпрограмма работала в другой транзакции, в декларативном разделе этого блока должно быть указано ключевое слово «
PRAGMA AUTONOMOUS_TRANSATION
». - Оно даст указание компилятору обрабатывать это как отдельную транзакцию, и сохранение / отмена внутри этого блока не будет отражаться в основной транзакции.
- Перед выходом из этой автономной транзакции в основную транзакцию необходимо выполнить
COMMIT
илиROLLBACK
, поскольку в любой момент может быть активна только одна транзакция. - Поэтому, как только мы сделали автономную транзакцию, нам нужно сохранить ее и завершить транзакцию, тогда только мы можем вернуться к основной транзакции сеанса.
Синтаксис автономной транзакции
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
...
BEGIN
<Основной блок программы>
[COMMIT|ROLLBACK]
END;
/
В приведенном выше синтаксисе блок был выполнен как автономная транзакция.
Примеры кода PL/SQL с автономной транзакцией
В этом примере мы собираемся понять, как работает автономная транзакция. Блоки основной и автономной транзакции приведены на рисунке ниже:
DECLARE
L_salary NUMBER;
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE emp
SET salary=salary+15000
WHERE emp_no=1002;
COMMIT;
E ND;
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‘||1_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 отражено, поскольку этот блок был выполнен как отдельная (автономная) транзакция и сохранен в конце.
Таким образом, независимо от сохранения / отмены в основной транзакции, изменения в автономной транзакции были сохранены без изменения основных транзакций.