Что такое TCL-операторы в PL / SQL?
TCL расшифровывается как Заявления о контроле транзакций. Он либо сохранит ожидающие транзакции, либо откатит ожидающую транзакцию. Эти операторы играют жизненно важную роль, потому что, если транзакция не сохранена, изменения через операторы DML не будут сохранены в базе данных. Ниже приведены различные заявления TCL.
COMMIT | Сохраняет все ожидающие транзакции |
ROLLBACK | Отменить все ожидающие транзакции |
SAVEPOINT | Создает точку в транзакции, до которой откат может быть выполнен позже |
Откат к | Отменить все ожидающие транзакции до указанной <точки сохранения> |
Транзакция будет завершена в следующих сценариях.
- Когда выдается какое-либо из вышеуказанных утверждений (кроме 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 отражено, поскольку этот блок был выполнен как отдельная транзакция и сохранен в конце.
- Таким образом, независимо от сохранения / сброса в основной транзакции, изменения в автономной транзакции были сохранены без изменения основных транзакций.