16.3. Примеры

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

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