У нас есть веб-сервис на сервере № 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 ()
Я искал это сообщение, но не сделал нашел любое соответствующее решение. Таким образом, что настройки я должен проверить и что точно я должен сделать для фиксации его?
Lanfear, я обнаружил такое же сообщение об ошибке и нашел решение. Ваша ситуация может быть другой, но я надеюсь, что следующие знания будут вам полезны.
System.Transactions.Transaction.Current.TransactionInformation.Status
вернет статус текущей транзакции.
В каждом случае, когда возникает исключение с сообщением Операция недействительна для состояния транзакции
, когда я перехожу через отладчик, я вижу, что до этого состояние было «Прервано». выбрасывается исключение.
В моем случае проблема была вызвана вложением двух транзакций друг в друга и ошибочным прерыванием обеих, когда я хотел прервать только одну. Очевидно, если вы используете конструктор по умолчанию TransactionScope
New TransactionScope ()
с двумя вложенными транзакциями, прерывание внутренней транзакции также прерывает внешнюю транзакцию. Решение состоит в использовании конструктора New TransactionScope (TransactionScopeOption.RequiresNew)
. Используя этот конструктор, внутренняя транзакция будет новой транзакцией, и ее прерывание не приведет к прерыванию внешней транзакции.
Это решило мою проблему.