38

を使用しようとしていますTransactionScopeが、以下の例外が発生し続けます。
重要な場合、アプリはデータベースとは別のマシンで実行されています。SQLServer2005を使用しています。

分散トランザクションマネージャー(MSDTC)のネットワークアクセスが無効になっています。コンポーネントサービス管理ツールを使用して、MSDTCのセキュリティ構成でネットワークアクセスに対してDTCを有効にしてください。

using (TransactionScope tsTransScope = new TransactionScope())
{
    //Do stuff here
    tsTransScope.Complete();
}

編集

フィードバックに基づいていくつか変更を加えました。今、私はこのエラーを受け取っています:

COMコンポーネントの呼び出しからエラーHRESULTE_FAILが返されました。」
基になるトランザクションマネージャとの通信に失敗しました。」

解決策 受け入れられた答えは、私が得ていた最初の問題を修正したと思います。2番目のエラーは、EntityFrameworkに固有のようです。別の質問を投稿します。

クライアントのプロパティは次のとおりです。
クライアントhttp://www.portnine.com/data/images/Misc/client.jpg

サーバーのプロパティは次のとおりです。
サーバーhttp://www.portnine.com/data/images/Misc/server.jpg

4

7 に答える 7

34

このMicrosoftTechNetの記事で説明されているように、ネットワークDTCアクセスを有効にする必要があります。この変更は、データベースサーバーとアプリケーションサーバーの両方で行う必要がある場合があります。多くの場合、DTCはすでにデータベースサーバーでオンになっているので、最初にアプリケーションサーバーを調べます。

これは、「リモート管理を許可する」オプションを除いて使用するもののスクリーンショットです。 セキュリティ構成のスクリーンショット

現在発生しているHRESULTE_Failの問題は発生していませんが、XP SP2とトランザクションに関するこの記事には、次の興味深い提案がありました。

知っておく必要のあるもう1つの構成設定(これは珍しいシナリオだと思いますが)は、RestrictRemoteClientsレジストリキーです。このキーの値が2(RPC_RESTRICT_REMOTE_CLIENT_HIGH)に設定されている場合、MSDTCネットワークトランザクションは正しく機能しません。MSDTCは、RPC_RESTRICT_REMOTE_CLIENT_NONE(0)およびRPC_RESTRICT_REMOTE_CLIENT_DEFAULT(1)の値のみをサポートします。 RestrictRemoteClientsの詳細については、 http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120を参照 してください。

最後に、問題に固有ではありませんが、TransactionScopeクラスの使用に関して注意すべき非常に重要なことは、デフォルト設定がSerializableのトランザクション分離レベルを利用することです。シリアル化可能は、分離レベルの中で最も制限が厳しく、率直に言って、デフォルトとして選択されたことは驚くべきことです。このレベルのロックが必要ない場合は、TransactionScope:をインスタンス化するときに、分離レベルをより制限の少ないオプション(ReadCommitted)に設定することを強くお勧めします。

var scopeOptions = new TransactionOptions();
scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
scopeOptions.Timeout = TimeSpan.MaxValue;

using (var scope = new TransactionScope(TransactionScopeOption.Required,
    scopeOptions))
{
    // your code here
}
于 2009-04-27T17:02:43.230 に答える
3

コントロールパネル-管理ツール-コンポーネントサービス-マイコンピュータのプロパティ-[MSDTC]タブ-[セキュリティの構成]タブ-ネットワークDTCアクセス(チェック)/リモートクライアントの許可(チェック)/インバウンドの許可(チェック)/アウトバウンドの許可(チェック)/ TIPトランザクションの有効化(チェック済み)

コンピュータを再起動します。

于 2009-04-27T17:00:25.780 に答える
2

使用しているバックエンドによっては、TransactionScopeで分散トランザクションマネージャーを有効にする必要がある場合がよくあります。詳細については、このMSDNブログをご覧ください。

また、複数のリソースを使用する場合は、DTCが必要になる場合があります。状況によっては、DTCを有効にする必要がある場合があります。または、SQL Server 2005を使用していて、軽量トランザクションで実行できることを維持していることを確認してください。

于 2009-04-27T17:02:02.123 に答える
1

コンポーネントサービス管理ツールを使用して、MSDTCのセキュリティ構成でネットワークアクセスに対してDTCを有効にする必要があります。

于 2009-04-27T17:02:22.950 に答える
0

SQL Server 2000を使用している場合は、System.Transactions.TransactionScopeすべてのトランザクションが分散トランザクションに昇格され、MS分散トランザクションコーディネーターが実行されている必要があります。

これを修正するには、MSDTCサービスを開始するか、SQL Server 2005にアップグレードするか、コードプロジェクトソリューションのようなものを実装します:http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

私はそれをする必要はありませんでしたが、DTCのネットワークセキュリティ設定を構成するためのOcdecioの回答も確認する必要があります。

于 2009-04-27T16:59:28.980 に答える
0

データベースサーバーとアプリケーションが実行されているサーバーの両方でネットワークDTCアクセスを有効にする必要があります。

また、接続がファイアウォールによってブロックされないことを確認する必要があります。データベースサーバーからアプリケーションマシンへの接続が開始されるため、アプリケーションマシンのファイアウォール例外のリストにMSDTCを追加することも同様に重要です。

于 2009-04-27T17:09:49.657 に答える
0

統合テストの実行でも同じ問題が発生しました。

これについての質問をここに投稿しました

しかし、最終的に私はそれを回避する方法を見つけました。ただし、本番コードでこれを行うことはお勧めしません。私はテストのコンテキスト内でそれを行っていました。

于 2009-04-27T17:46:11.910 に答える