19

サーバー #1 に Web サービスがあり、サーバー #2 にデータベースがあります。Web サービスは、トランザクション スコープを使用して分散トランザクションを生成します。すべてが正しいです。

そして、サーバー #3 に別のデータベースがあります。このサーバーに問題があり、オペレーティング システムとソフトウェアを再インストールしました。MSDTC を構成し、サーバー #1 の Web サービスを使用して、このサーバー上のデータベースと通信しようとしました。そして、トランザクション スコープ内の最初の select ステートメントの後、次のようになりますThe operation is not valid for the state of the transaction。この例外は、トランザクション スコープを使用している場合、すべての Web サービス リクエストに当てはまります。サーバー #2 とサーバー #3 はほぼ同じです。違いは設定だけです。.NET Framework 3.5 SP1 がインストールされ、すべてのサーバーに SQL Server SP3 がインストールされています。

完全なスタック トレース:

System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) в System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction t в System.Data.SqlClient.SqlInternalConnection .Enlist(Transaction t × System.Data.SqlClient.SqlInternalConnectionTds.Activate(トランザクション トランザクション) × System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(トランザクション トランザクション) × System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) × System. Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) в システム。Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) v System.Data.SqlClient.SqlConnection.Open() v NHibernate.Connection.DriverConnectionProvider.GetConnection() v NHibernate.Impl.SessionFactoryImpl.OpenConnection()

このメッセージを検索しましたが、適切な解決策が見つかりませんでした。では、どの設定を確認する必要があり、それを修正するには正確に何をすればよいでしょうか?

4

2 に答える 2

30

Lanfear、私は同じエラーメッセージに出くわし、解決策を見つけました。状況は異なるかもしれませんが、以下の知識がお役に立てば幸いです。

System.Transactions.Transaction.Current.TransactionInformation.Status現在のトランザクションのステータスを返します。

メッセージとともに例外がスローされる場合はいずれもThe operation is not valid for the state of the transaction、デバッガーをステップスルーすると、例外がスローされる前にステータスが「中止」になっていることがわかります。

私の場合、問題は2つのトランザクションを相互にネストし、1つだけを中止したいときに誤って両方を中止したことが原因でした。明らかに、 2つのネストされたトランザクションでTransactionScopeデフォルトのコンストラクターを使用する場合New TransactionScope()、内部トランザクションを中止すると、外部トランザクションも中止されます。解決策は、コンストラクターを使用することですNew TransactionScope(TransactionScopeOption.RequiresNew) 。このコンストラクターを使用すると、内部トランザクションは新しいトランザクションになり、それを中止しても外部トランザクションは中止されません。

これで私の問題は解決しました。

于 2010-06-28T21:10:02.367 に答える
5

分散トランザクションコーディネーターを有効にすると、問題が解決しました(これは、Webサービスを備えたマシンとデータベースを備えたマシンの両方で行われました。Webサービスに必要かどうかはわかりません)。

ここで説明する手順に従って、DTCを有効にし、Windowsファイアウォールに例外を追加しました。WindowsServer2008のネットワークDTCアクセスを有効にする

于 2011-04-08T11:14:49.133 に答える