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

Любая база данных построена на транзакцияхOracle database в этом смысле не исключение. Любые операции с данными в таблицах Oracle явно или неявно происходят внутри транзакций. Однако база данных Oracle начиная с восьмой версии имеет дополнительный механизм работы с транзакциям, называемый автономными транзакциями.Автономные транзакции Oracle могут быть использованы внутри текущей обычной транзакции, не затрагивая ее. Стандартная область применения автономных транзакций это ведение лога каких либо процессов базы данных. Когда необходимо внести запись в таблицу логов в любом случае, вне зависимости от того, завершится основная транзакция (commit) или будет выполнен ее откат (rollback). Или же в подобных случаях, главное здесь фиксация некоторых результатов вне зависимости от выполнения или отката основной транзакции.Автономные транзакции могут применяться в PL/SQL процедурах, функциях, анонимных PL/SQL блоках или триггерах базы данных. Обязательно код автономной транзакции должен завершаться оператором фиксации commit или отката rollback. Иначе в результате выполнения автономной транзакции вы получите ошибку “ORA-06519: выполнен откат для незавершенной автономной транзакции”.Для того, чтобы объявить автономную транзакцию в PL/SQL процедуре, функции, триггере или анонимном PL/SQL блоке необходимо объявить инструкцию компилятору pragma autonomous_transaction;

Примеры

Ниже приводится пример PL/SQL процедуры, использующей автономную транзакцию для записи сообщения в таблицу T_LOG:

CREATE OR REPLACE
PROCEDURE LOG (psMSG IN VARCHAR2)
IS
  PRAGMA autonomous_transaction;
BEGIN
  INSERT
    INTO T_LOG
   VALUES (psMSG);
  COMMIT;
END LOG;
/

Для PL/SQL функции объявление автономной транзакции выполняется аналогично. Пример для анонимного PL/SQL блока:

DECLARE
  PRAGMA autonomous_transaction;
BEGIN
  -- Save audit info
  ...
  COMMIT;
END;
/

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

CREATE OR REPLACE
TRIGGER DATABASE_BL
  before LOGOFF
  ON database
DECLARE
  PRAGMA autonomous_transaction;
BEGIN
  -- Save audit info
  ...
  COMMIT;
END;
/

Чтобы записать информацию об удачном логине пользователя, такую же технологию можно использовать в триггере базы данных, который срабатывает после логина пользователя:

CREATE OR REPLACE
TRIGGER DATABASE_BL
  after LOGON
  ON database
DECLARE
  PRAGMA autonomous_transaction;
BEGIN
  -- Save audit info
  COMMIT;
END;
/

Заключение

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

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

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

Ссылка на основную публикацию