Этот пример показывает, как выполняется автономная транзакция. Непрерывная линия обозначает активную транзакцию, а пунктирная — транзакцию, которая была приостановлена и помещена в стек автономных транзакций. Течение времени направлено вниз.
BEGIN; -- начинается обычная транзакция T0 | INSERT INTO t VALUES (1); :\ : BEGIN AUTONOMOUS TRANSACTION; -- начинается автономная транзакция : | -- T1, транзакция T0 помещается в стек : | : INSERT INTO t VALUES (2); : | : COMMIT AUTONOMOUS TRANSACTION / ROLLBACK AUTONOMOUS TRANSACTION; : | -- завершается автономная транзакция : | -- T1, транзакция T0 извлекается из стека :/ COMMIT / ROLLBACK; -- завершается транзакция T0
В зависимости от выбора из COMMIT и ROLLBACK в двух местах, мы можем получить четыре разных результата из:
SELECT sum(x) from t;
В одной родительской транзакции может быть несколько автономных транзакций, если приложение будет просто повторять цикл помещения/извлечения их из стека.
BEGIN; -- начинается обычная транзакция T0 | INSERT INTO t VALUES (1); :\ : BEGIN AUTONOMOUS TRANSACTION; -- начинается автономная транзакция : | -- T1, транзакция T0 помещается в стек : | : INSERT INTO t VALUES (2); : | : COMMIT AUTONOMOUS TRANSACTION / ROLLBACK AUTONOMOUS TRANSACTION; : | -- завершается автономная транзакция : | -- T1, транзакция T0 извлекается из стека :/ | :\ : BEGIN AUTONOMOUS TRANSACTION; -- начинается автономная транзакция : | -- T2, транзакция T0 помещается в стек : | : INSERT INTO t VALUES (4); : | : COMMIT AUTONOMOUS TRANSACTION / ROLLBACK AUTONOMOUS TRANSACTION; : | -- завершается автономная транзакция : | -- T2, транзакция T0 извлекается из стека :/ COMMIT / ROLLBACK; -- завершается транзакция T0