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

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

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

Полная трассировка стека:

System.Transactions.TransactionState.EnlistPromotableSinglePhase (InternalTransaction ТХ, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, сделка AtomicTransaction) в System.Transactions.Transaction.EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull (Transaction т в System.Data.SqlClient.SqlInternalConnection .Enlist (транзакция t в System.Data.SqlClient.SqlInternalConnectionTds.Activate (транзакция транзакции) в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection (транзакция транзакции) в System.Data.ProviderBase.DbConnectionPool.GetConnection собственная система. Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory) в System.Data.SqlCl ient.SqlConnection.Open () в NHibernate.Connection.DriverConnectionProvider.GetConnection () в NHibernate.Impl.SessionFactoryImpl.OpenConnection ()

Я просмотрел это сообщение, но не нашел подходящего решения. Итак, какие настройки я должен проверить и что именно я должен сделать, чтобы это исправить?


person Mykhail Galushko    schedule 12.04.2010    source источник
comment
Какую ОС и как именно вы настраивали MSDTC?   -  person Remus Rusanu    schedule 12.04.2010
comment
Какую форму конструктора TransactionScope () вы используете?   -  person gprasant    schedule 20.12.2010
comment
Привет, Lanfear, Вы решили эту проблему? Мы получаем такую ​​же ошибку в тестовой среде. Тот же код в среде Dev работает нормально.   -  person Samir Vaidya    schedule 18.02.2011


Ответы (2)


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

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

В каждом случае, когда возникает исключение с сообщением The operation is not valid for the state of the transaction, когда я перехожу через отладчик, я вижу, что статус «Прерван» до того, как возникнет исключение.

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

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

person Vivian River    schedule 28.06.2010
comment
System.Transactions.Transaction.Current.TransactionInformation.Status помог мне точно определить, когда транзакция была прервана. - person Adam Marshall; 31.03.2014
comment
Образец реального мира @AdamMarshall с использованием TransactionInformation.Status? - person Kiquenet; 14.05.2018

Включение координатора распределенных транзакций решило проблему для меня (это было сделано на обеих машинах: на той, на которой есть веб-служба, и на той, которая имеет базу данных. Не уверен, что это необходимо для веб-службы).

Я выполнил описанные здесь шаги, чтобы включить DTC и добавить исключение в брандмауэр Windows: Включить доступ к сети DTC для Windows Server 2008

person SzilardD    schedule 08.04.2011