Вы можете использовать глобальную переменную @@ TRANCOUNT, чтобы увидеть, как это работает.
Если вы запустите select @@TRANCOUNT
и у вас нет транзакций, вы получите 0.
Каждый раз, когда запускается begin transaction
, @@ TRANCOUNT увеличивается на 1.
Каждый раз, когда commit (transaction)
запускается, @@ TRANCOUNT уменьшается на 1. Если для этого @@ TRANCOUNT установлено значение 0, то транзакции (ы) действительно зафиксированы.
С другой стороны, rollback (transaction)
установит @@ TRANCOUNT в 0 и откатит все изменения независимо от значения @@ TRANCOUNT в то время.
Итак, функциональное вложение отсутствует. Существует только этот счетчик, позволяющий различным модулям самостоятельно обрабатывать транзакции.
Я рекомендую статью Эрланда Соммерскога для дальнейшего чтения.