16.2. Видимость
Правила видимости для автономных транзакций действуют так же, как и для независимых транзакций, выполняемых через dblink
. Автономные транзакции не видят результата действия родительской транзакции, как ещё не зафиксированной. В то же время, если автономные транзакции, которые предшествуют активной автономной транзакции, уже зафиксированы, то активная транзакция будет видеть результат действия этих транзакций. Родительская транзакция может видеть результат действия вложенных в неё автономных транзакций в зависимости от её уровня изоляции. Например, родительская транзакция с уровнем изоляции Read Committed будет видеть все изменения, вносимые автономными транзакциями. Однако если для родительской транзакции выбран уровень Repeatable Read, результат действия автономных транзакций не будет виден.
Рассмотрим следующий пример с набором как последовательных, так и вложенных транзакций. Для каждой транзакции в наборе указан её статус. Кроме того, выделены транзакции, которые уже были зафиксированы.
- Обычная транзакция T0 [ПРИОСТАНОВЛЕНА] - Автономная транзакция A0 [ЗАФИКСИРОВАНА] - Автономная транзакция A1 [ЗАФИКСИРОВАНА] - Автономная транзакция A2 [ПРИОСТАНОВЛЕНА] - Автономная транзакция A2.0 [ЗАФИКСИРОВАНА] - Автономная транзакция A2.1 [ПРИОСТАНОВЛЕНА] - Автономная транзакция A2.1.0 [АКТИВНА]
В примере выше активная автономная транзакция A2.1.0
не видит результат действия предшествующих транзакций T0
, A2
и A2.1
, которые приостановлены и ещё не зафиксированы, независимо от их типа. Однако активная транзакция видит результат действия предшествующих автономных транзакций A0
, A1
и A2.0
, которые уже были зафиксированы.
Автономные транзакции могут порождать взаимоблокировки в одном сеансе, так как автономная транзакция может конфликтовать с любой из приостановленных транзакций в том же сеансе. Если автономная транзакция попытается получить какой-либо ресурс, заблокированный родительской транзакцией, возникнет взаимоблокировка.