Исключение “Операция не допустимо для состояния транзакции” использование TransactionScope

У нас есть веб-сервис на сервере № 1 и база данных по серверу № 2. Веб-сервис использует область транзакций для создания распределенной транзакции. Все корректно.

И у нас есть другая база данных по серверу № 3. У нас были некоторые проблемы с этим сервером, и мы переустановили операционную систему и программное обеспечение. Мы настроили MSDTC и попытались использовать веб-сервис с сервера № 1 для общения с базой данных по этому серверу. И теперь после первого избранного оператора в области транзакций мы добираемся: The operation is not valid for the state of the transaction. Это исключение падает в каждом запросе к веб-сервису, если это использует область транзакций. Сервер № 2 и Сервер № 3 почти подобен. Различие может быть только в настройках. платформа.NET 3,5 установленные SP1 и SQL Server SP3 на всех серверах.

Полный stacktrace:

Система. Транзакции. TransactionState. EnlistPromotableSinglePhase (InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Транзакция atomicTransaction) в Система. Транзакции. Транзакция. EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в Система. Данные. SqlClient. SqlInternalConnection. EnlistNonNull (Транзакция t в Система. Данные. SqlClient. SqlInternalConnection. Поступите на службу (Транзакция t в Система. Данные. SqlClient. SqlInternalConnectionTds. Активируйте (Транзакция транзакции) в Систему. Данные. ProviderBase. DbConnectionInternal. ActivateConnection (Транзакция транзакции) в Система. Данные. ProviderBase. DbConnectionPool. GetConnection (DbConnection owningObject) в Система. Данные. ProviderBase. DbConnectionFactory. GetConnection (DbConnection owningConnection) в Система. Данные. ProviderBase. DbConnectionClosed. OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) в Система. Данные. SqlClient. SqlConnection. Открытый () в NHibernate. Соединение. DriverConnectionProvider. GetConnection () в NHibernate. Impl. SessionFactoryImpl. OpenConnection ()

Я искал это сообщение, но не сделал нашел любое соответствующее решение. Таким образом, что настройки я должен проверить и что точно я должен сделать для фиксации его?

18
задан abatishchev 29 April 2016 в 23:58
поделиться

1 ответ

Lanfear, я обнаружил такое же сообщение об ошибке и нашел решение. Ваша ситуация может быть другой, но я надеюсь, что следующие знания будут вам полезны.

System.Transactions.Transaction.Current.TransactionInformation.Status вернет статус текущей транзакции.

В каждом случае, когда возникает исключение с сообщением Операция недействительна для состояния транзакции , когда я перехожу через отладчик, я вижу, что до этого состояние было «Прервано». выбрасывается исключение.

В моем случае проблема была вызвана вложением двух транзакций друг в друга и ошибочным прерыванием обеих, когда я хотел прервать только одну. Очевидно, если вы используете конструктор по умолчанию TransactionScope New TransactionScope () с двумя вложенными транзакциями, прерывание внутренней транзакции также прерывает внешнюю транзакцию. Решение состоит в использовании конструктора New TransactionScope (TransactionScopeOption.RequiresNew) . Используя этот конструктор, внутренняя транзакция будет новой транзакцией, и ее прерывание не приведет к прерыванию внешней транзакции.

Это решило мою проблему.

30
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: