Добавить в корзинуПозвонить
Найти в Дзене
Oracle Developer

Автономные транзакции в PL/SQL: транзакционная магия✨

Если вы пишете на PL/SQL, то наверняка сталкивались с ситуацией, когда необходимо зафиксировать изменения независимо от текущей транзакции. Именно в таких случаях на сцену выходят автономные транзакции в Oracle! Давайте разберёмся, как они работают и когда их стоит использовать. Автономные транзакции (autonomous transactions, АТ) позволяют создать подтранзакцию, которая может быть зафиксирована (commit) или отменена (rollback) независимо от родительской транзакции. Другими словами, даже если основной процесс откатится, данные из автономной транзакции останутся нетронутыми. Для этого используется специальная директива компилятора PL/SQL: PRAGMA AUTONOMOUS_TRANSACTION; АТ можно применять в любом PL/SQL-блоке: 💡 Важно: автономную транзакцию обязательно нужно завершать оператором фиксации (commit) или отката (rollback). Рассмотрим простой пример, где создаётся процедура для логирования сообщений в отдельную таблицу log_table: CREATE OR REPLACE PROCEDURE log_message(p_message VARCHAR2) IS
Оглавление

Если вы пишете на PL/SQL, то наверняка сталкивались с ситуацией, когда необходимо зафиксировать изменения независимо от текущей транзакции. Именно в таких случаях на сцену выходят автономные транзакции в Oracle! Давайте разберёмся, как они работают и когда их стоит использовать.

🔧 Что такое автономные транзакции?

Автономные транзакции (autonomous transactions, АТ) позволяют создать подтранзакцию, которая может быть зафиксирована (commit) или отменена (rollback) независимо от родительской транзакции.

Другими словами, даже если основной процесс откатится, данные из автономной транзакции останутся нетронутыми.

Для этого используется специальная директива компилятора PL/SQL:

PRAGMA AUTONOMOUS_TRANSACTION;

АТ можно применять в любом PL/SQL-блоке:

  • анонимных блоках,
  • функциях,
  • процедурах,
  • триггерах.

💡 Важно: автономную транзакцию обязательно нужно завершать оператором фиксации (commit) или отката (rollback).

-2

📌 Пример создания процедуры с автономной транзакцией

Рассмотрим простой пример, где создаётся процедура для логирования сообщений в отдельную таблицу log_table:

CREATE OR REPLACE PROCEDURE log_message(p_message VARCHAR2) IS
BEGIN
INSERT INTO log_table (log_id, log_text, log_date)
VALUES (log_seq.NEXTVAL, p_message, SYSTIMESTAMP);

COMMIT;
END log_message;
/
Теперь добавим автономную транзакцию:
CREATE OR REPLACE PROCEDURE log_message(p_message VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO log_table (log_id, log_text, log_date)
VALUES (log_seq.NEXTVAL, p_message, SYSTIMESTAMP);

COMMIT;
END log_message;
/

Теперь эта процедура может фиксировать данные в журнале, даже если основная транзакция откатится.

🔥 Когда автономные транзакции незаменимы?

  1. Логирование и аудит ✍️
    ✅ Запись действий будет зафиксирована, даже если родительская транзакция откатится. Это удобно для журналирования событий, регистрации ошибок, ведения истории изменений.
  2. DDL-операции внутри PL/SQL 🔄
    ✅ DDL-команды (например, CREATE, ALTER, DROP) выполняют
    неявный COMMIT, что может нарушить целостность родительской транзакции. Автономная транзакция позволяет избежать этого.

💡 Но будьте осторожны!

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

✅ Заключение

Автономные транзакции — мощный инструмент в арсенале PL/SQL-разработчика. Они позволяют логировать события, выполнять DDL-операции и сохранять данные независимо от основной транзакции. Главное — не забывать про commit/rollback, а также следить за целостностью данных.

А где вы используете автономные транзакции? Делитесь в комментариях! 👇

----------

Хотите разбираться в таких вещах на экспертном уровне? На нашем YouTube-канале мы регулярно разбираем подобные темы, а в Telegram-канале можно задать вопросы и пообщаться с коллегами! Присоединяйтесь! 💡

А еще в нашей онлайн-школе мы проводим обучение по направлениям:🔸PL/SQL; 🔸оптимизация Oracle SQL; 🔸секционирование; 🔸архитектуре СУБД; 🔸Unit-тестированию и др.

Работаем как с физическими так и с юридическими лицами. Напишите в
нашу поддержку или Денису напрямую. Всё официально с возможностью получить налоговый вычет, использовать мат капитал или другие плюшки.

Лицензия на дополнительное образование взрослых и детей Л035-01199-54/01691393 выдана 13.01.2025 г. Министерством образование Новосибирской области Российской Федерации

🔗 Полезные ссылки:

#PLSQL #Oracle #транзакции #разработка #SQL #базыданных