Вы создаете scope2 без явного параметра TransactionScopeOption
, который дает значение по умолчанию TransactionScopeOption.Required
, см. Раздел Замечания в пределах TransactionScope Constructor
Этот конструктор создает новый
объем транзакции с транзакцией
опция объема равна Обязательна. это
означает, что требуется транзакция
по новой сфере и окружающей
транзакция используется, если она уже
существует. В противном случае это создает новый
транзакция до входа в область действия.
В вашем примере окружение TransactionScope
действительно уже существует (scope1
), следовательно, новый вложенный TransactionScope
(scope2
) с неявным параметром TransactionScopeOption.Required
использует существующую транзакцию окружения, а не создает новую Сама сделка.
Однако неявная семантика транзакции scope2
все еще остается в силе, поэтому существующая окружающая транзакция, созданная scope1
, прерывается, потому что вы не вызываете Complete
в конце scope2
Если этот метод не вызывается, прерывается
транзакция, потому что транзакция
менеджер интерпретирует это как систему
сбой или эквивалент исключения
выброшено в рамках сделки
Конечно, проблема сразу исчезнет, если вы удалите scope2
или измените его семантику на TransactionScopeOption.RequiresNew
(что означает 'Для области всегда создается новая транзакция.' ), потому что существующий окружающий транзакция, созданная scope1
, больше не будет затронута.
См. Реализация неявной транзакции с использованием объема транзакции для получения более подробной информации об этом.