TransactionScope を使用した例外「この操作はトランザクションの状態に対して有効ではありません」質問する

TransactionScope を使用した例外「この操作はトランザクションの状態に対して有効ではありません」質問する

サーバー #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(Transaction transaction) в System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) в System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) в System.Data.SqlClient.SqlConnection.Open() в NHibernate.Connection.DriverConnectionProvider.GetConnection() в NHibernate.Impl.SessionFactoryImpl.OpenConnection()

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

ベストアンサー1

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)このコンストラクターを使用すると、内部トランザクションは新しいトランザクションになり、それを中止しても外部トランザクションは中止されません。

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

おすすめ記事