Ответ 1
Вам, вероятно, не понравится этот ответ, но...
Голосование внутри вложенной области
Хотя вложенная область может присоединиться к внешней транзакции корневой области, вызов Полный во вложенной области не влияет на область корня. Только если все области действия от корневой области до последней вложенной области голосуют для фиксации транзакции, транзакция будет выполнена.
(Из Внедрение неявной транзакции с использованием области транзакций)
К сожалению, класс TransactionScope
не предоставляет никакого механизма (который я знаю) для разделения единиц работы. Это все или ничего. Вы можете предотвратить любую транзакцию на определенной единице работы с помощью TransactionScopeOption.Suppress
, но это, вероятно, не то, что вы хотите, так как тогда вы потеряете атомарность для того, что находится внутри этой области.
При использовании TransactionScope
существует только одна "окружающая" транзакция. Когда a TransactionScope
удаляется или собирается без выполнения Complete
, вся окружающая транзакция возвращается обратно; что он, игра закончилась.
Фактически SQL Server вообще не поддерживает истинные вложенные транзакции, хотя возможно (хотя и несколько неинтуитивно) достичь того же конечного результата с соответствующим использованием операторов SAVE TRAN
. Повторная реализация этой логики как хранимой процедуры (или нескольких из них) может быть вашим лучшим вариантом, если вам требуется это конкретное поведение.