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