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

⚡ Умное резюме

Заявления о контроле транзакций в Oracle В PL/SQL, а именно в командах COMMIT, ROLLBACK и SAVEPOINT, определяется, будут ли сохранены или отменены ожидающие изменения DML. Автономная транзакция выполняется как независимая подпрограмма, которая фиксирует или откатывает изменения отдельно от основной транзакции.

  • 💾 СОВЕРШИТЬ: Делает все ожидающие изменения DML постоянными, завершает транзакцию, снимает блокировки и удаляет все точки сохранения.
  • 🇧🇷 ОТКАТ: Отменяет ожидающие изменения, либо всю транзакцию целиком, либо возврат к указанной точке сохранения.
  • 📌 ТОЧКА СОХРАНЕНИЯ: Отмечает точку внутри транзакции, так что последующий откат (ROLLBACK TO) сможет отменить только часть выполненной работы.
  • 🔀 Автономная транзакция: Директива PRAGMA AUTONOMOUS_TRANSACTION позволяет подпрограмме самостоятельно фиксировать или откатывать транзакции.
  • 🧾 Случаи использования: Автономные транзакции требуют аудита и регистрации ошибок, которые должны сохраняться даже в случае отката основной работы.
  • 🤖 Помощь ИИ: Искусственный интеллект-помощники, такие как GitHub Copilot, создают блоки COMMIT, ROLLBACK и PRAGMA и отмечают отсутствующие коммиты.

Автономная транзакция в Oracle PL/SQL с использованием COMMIT и ROLLBACK

Что такое операторы TCL в PL/SQL?

TCL расшифровывается как Transaction Control Statements (операторы управления транзакциями). Эти операторы либо сохраняют незавершенные транзакции, либо откатывают их. Они играют жизненно важную роль, поскольку, если транзакция не сохранена, изменения, внесенные через нее, не будут отменены. Операторы DML Эти данные не будут храниться в базе данных постоянно. Ниже приведены различные операторы TCL. PL/SQL.

заявление Описание
COMMIT Сохраняет все незавершенные транзакции.
ОТКАТ Отменяет все незавершенные транзакции.
ТОЧКА СОХРАНЕНИЯ Создает точку в транзакции, до которой впоследствии можно будет выполнить откат.
ОТКАТ ДО Отменяет все незавершенные транзакции до указанной точки сохранения.

Сделка будет завершена при следующих сценариях:

  • При выдаче любого из вышеуказанных сообщений (кроме SAVEPOINT).
  • Когда выполняются операторы DDL (DDL — это операторы автокоммита).
  • Когда выполняются операторы DCL (DCL — это операторы автокоммита).

Использование точки сохранения и отката к

В таблице выше представлены термины SAVEPOINT и ROLLBACK TO, которые вместе дают частичный контроль над транзакцией. SAVEPOINT отмечает именованную точку внутри текущей транзакции. Последующий откат к этой точке сохранения отменяет все изменения, внесенные после нее, в то время как keeping проделанная ранее работа осталась неизменной.

Это полезно, когда длительная транзакция выполняет несколько операций. SQL Процесс состоит из нескольких шагов, и только последний шаг завершается неудачей. Вместо того чтобы отменить всю транзакцию, вы можете вернуться к последней работоспособной точке сохранения и продолжить.

Синтаксис:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Основные моменты, которые следует помнить о точках сохранения:

  • Точка сохранения существует только внутри текущей транзакции; операция COMMIT или полный откат удаляют все точки сохранения.
  • При откате к точке сохранения все точки сохранения, созданные после неё, удаляются, но точка сохранения, к которой вы вернулись, сохраняется.
  • Команда ROLLBACK TO не завершает транзакцию; изменения, внесенные до точки сохранения, остаются в состоянии ожидания до тех пор, пока вы не выполните команду COMMIT или ROLLBACK.
  • Если вы повторно используете имя точки сохранения, новая версия SAVEPOINT переместит маркер в более позднюю позицию.

Поскольку команда ROLLBACK TO оставляет транзакцию открытой, вы все равно в конце решаете, следует ли зафиксировать оставшиеся изменения или отменить их с помощью полного отката (ROLLBACK).

Что такое автономная транзакция

В PL/SQL все изменения данных называются транзакцией. Транзакция считается завершенной, когда к ней применяется команда сохранения или отмены. Если команда сохранения или отмены не указана, транзакция не считается завершенной, и изменения данных не будут зафиксированы на сервере.

По умолчанию PL/SQL рассматривает все изменения в течение сессии как единую транзакцию, и сохранение или отмена этой транзакции влияет на все ожидающие изменения в сессии. Автономная транзакция предоставляет разработчику возможность вносить изменения в отдельной транзакции и сохранять или отменять эту конкретную транзакцию, не затрагивая основную транзакцию сессии.

  • Автономная транзакция может быть определена на уровне подпрограммы.
  • Чтобы сделать любой подпрограмма Для работы в другой транзакции в декларативной секции соответствующего блока следует указать ключевое слово PRAGMA AUTONOMOUS_TRANSACTION.
  • Это указывает компилятору рассматривать это как отдельную транзакцию, и сохранение или удаление данных внутри этого блока не будет отражаться в основной транзакции.
  • Перед выходом из этой автономной транзакции и возвращением к основной транзакции обязательно необходимо выполнить команды COMMIT или ROLLBACK, поскольку в любой момент времени может быть активна только одна транзакция.
  • Таким образом, после начала автономной транзакции ее необходимо сохранить и завершить, прежде чем управление сможет вернуться к основной транзакции.

Синтаксис:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

В приведенном выше синтаксисе блок преобразован в автономную транзакцию.

Пример 1: В этом примере мы разберемся, как работает автономная транзакция.

На скриншоте ниже показан пример автономной транзакции и её результат. Oracle.

Пример автономной транзакции, в которой фиксируется вложенный блок, а основная транзакция откатывается. Oracle PL/SQL

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

Code Объяснение:

  • Code строка 2: Объявляем l_salary как NUMBER.
  • Code строка 3: Объявление процедуры nested_block.
  • Code строка 4: Преобразование процедуры nested_block в AUTONOMOUS_TRANSACTION.
  • Code строки 7-9: Увеличение зарплаты сотруднику номер 1002 на 15000.
  • Code строка 10: Осуществление автономной транзакции.
  • Code строки 13-16: Вывод данных о заработной плате сотрудников 1001 и 1002 до внесения изменений.
  • Code строки 17-19: Увеличение зарплаты сотруднику номер 1001 на 5000.
  • Code строка 20: Вызов процедуры nested_block.
  • Code строка 21: Отмена основной транзакции.
  • Code строки 22-25: Вывод данных о заработной плате сотрудников 1001 и 1002 после внесения изменений.

Повышение заработной платы сотрудника № 1001 не отражено, поскольку основная транзакция была отменена. Повышение заработной платы сотрудника № 1002 отражено, поскольку эта операция была оформлена как отдельная транзакция и сохранена в конце.

Таким образом, независимо от сохранения или отмены изменений в основной транзакции, изменения в автономной транзакции сохраняются без влияния на основную транзакцию.

Когда следует использовать автономные транзакции?

Автономные транзакции — мощный инструмент, поэтому важно понимать, когда их следует использовать. Их следует применять только для задач, успех или неудача которых должны быть независимы от основной транзакции, а не для основ бизнес-логики. Типичные примеры использования:

  • Журнал аудита: Записывайте, кто изменил конфиденциальные данные, когда, а также старые и новые значения, чтобы журнал сохранился даже в случае отката основной транзакции.
  • Регистрация ошибок: Записать запись об ошибке внутри исключение Обработчик и COMMIT сохранят диагностические данные, а неудачная транзакция будет отброшена.
  • Счетчики и статистика: Необходимо установить счетчик использования или количество обращений, который должен сохраняться независимо от результата вызова.
  • COMMIT внутри триггера: Триггер не может напрямую выполнить команду COMMIT; это единственный поддерживаемый способ сделать это с помощью автономной транзакции.

Избегайте автономных транзакций для обычных обновлений, судьба которых должна совпадать с судьбой основной транзакции. Чрезмерное их использование может скрывать данные за независимыми подтверждениями и затруднять отладку. Как правило, каждый автономный блок должен заканчиваться явным COMMIT или ROLLBACK.

Автономные и обычные транзакции

Разница между обычной (основной) транзакцией и автономной транзакцией сводится к объему и независимости. В таблице ниже приведено их сравнение.

Аспект Обычная транзакция Автономная транзакция
Объем Поделиться одной транзакцией сессии Выполняется как отдельная дочерняя транзакция.
Эффект COMMIT / ROLLBACK Влияет на все ожидающие изменения сессии. Затрагивает только автономный блок.
Декларация Поведение по умолчанию PRAGMA AUTONOMOUS_TRANSACTION в декларативном разделе
Влияние отката родительского процесса Изменения теряются Автономные изменения сохраняются.
Типичное использование Основная бизнес-логика Аудит и регистрация ошибок

В отличие от обычного вложенный блокАвтономный блок, изменения в котором всегда зависят от результата основной транзакции, существует сам по себе. Понимание этой разницы помогает решить, когда блок должен быть независимым, а когда он должен зависеть от результата основной транзакции.

Часто задаваемые вопросы (FAQ)

Oracle Вызывает ошибку ORA-06519 и откатывает автономную работу. Каждая автономная транзакция должна завершиться явным COMMIT или ROLLBACK, прежде чем управление вернется к основной транзакции, поскольку одновременно разрешена только одна активная транзакция.

Не напрямую. Обычный триггер не может выполнить команды COMMIT или ROLLBACK. Объявление триггера или вызываемой им процедуры с помощью PRAGMA AUTONOMOUS_TRANSACTION позволяет ему фиксировать собственные изменения независимо от оператора, вызвавшего триггер.

Нет. После приостановки родительской транзакции автономная транзакция выполняется независимо и не может видеть незафиксированные изменения родительской транзакции. Она видит только данные, уже зафиксированные в базе данных, поэтому ожидание блокировки родительской транзакции может привести к взаимоблокировке.

Да. Каждое оператор DDL, такой как CREATE, ALTER или DROP, неявно фиксирует изменения (COMMIT) до и после своего выполнения. Любые незавершенные операции DML в сессии фиксируются автоматически, поэтому оператор DDL нельзя отменить впоследствии.

Автономный блок может вызывать другой, и каждый из них управляет собственными операциями COMMIT или ROLLBACK. Oracle Параметр инициализации TRANSACTIONS ограничивает количество одновременно активных транзакций, поэтому очень глубокая вложенность автономных блоков может привести к сбою.

Нет. Операция COMMIT делает изменения необратимыми, снимает блокировки и удаляет точки сохранения, поэтому её нельзя отменить с помощью ROLLBACK. Для отмены зафиксированных данных необходимо выполнить новую операцию DML. Используйте SAVEPOINT и ROLLBACK TO для частичной отмены перед фиксацией.

Да. Второй пилот GitHub Создает на основе комментария логику COMMIT и ROLLBACK, блоки SAVEPOINT и процедуры PRAGMA AUTONOMOUS_TRANSACTION. RevОбратите внимание на размещение коммитов и обработку ошибок, поскольку неправильно размещенный коммит может нарушить границы транзакций.

Искусственный интеллект-помощники сканируют процедуры на предмет отсутствующих или неправильно расположенных операторов COMMIT и ROLLBACK, фиксации транзакций внутри циклов и незакрытых автономных блоков. Этот анализ с помощью машинного обучения выявляет ошибки транзакций и предлагает более безопасные границы до того, как код попадет в продакшн.

Подведем итог этой публикации следующим образом: