SQL ServerでMSDTCを有効にするにはどうすればよいですか?


106

これは有効な質問ですか?MSTDCを使用している.NET Windowsアプリがあり、例外がスローされています。

System.Transactions.TransactionManagerCommunicationException:分散トランザクションマネージャー(MSDTC)のネットワークアクセスが無効になっています。コンポーネントサービス管理ツール---> System.Runtime.InteropServices.COMException(0x8004D024)を使用して、MSDTCのセキュリティ構成でネットワークアクセスのDTCを有効にしてください:トランザクションマネージャーは、リモート/ネットワークトランザクションのサポートを無効にしました。(HRESULTからの例外:0x8004D024)System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize、Byte [] propgationToken、IntPtr managedIdentifier、Guid&transactionIdentifier、OletxTransactionIsolationLevel&isolationLevel、ITransactionShim&transactionShim)。

Kbalertzガイドに従ってアプリがインストールされているPCでMSDTCを有効にしましたが、エラーは引き続き発生します。

これがデータベースの問題かどうか疑問に思っていましたか?もしそうなら、どうすればそれを解決できますか?


上記の解決策で問題が解決しない場合は、このリンクを
Shahab J

回答:


127

これをWindows Server 2008 R2およびWindows Server 2012 R2に使用します

  1. [ スタート]、[ ファイル名を指定して実行 ]の順にクリックし、「dcomcnfg」と入力して、[ OK ]をクリックしてコンポーネントサービスを開きます

  2. コンソールツリーで、[ コンポーネントサービス ] 、[ コンピューター]、[ マイコンピューター]、[ 分散トランザクションコーディネーター ]、[ ローカルDTC ]の順にクリックして展開します

  3. 右クリックし、ローカルDTCをクリックし、プロパティを表示するには、ローカルDTCのプロパティ ]ダイアログボックスをオンにします。

  4. [ セキュリティ ]タブをクリックします。

  5. [ ネットワークDTCアクセス]チェックボックスをオンにします。

  6. 最後に、インバウンドを許可する」「アウトバウンドを許可する」チェックボックスをオンにします。

  7. [ 適用]、[ OK]の順にクリックします。

  8. サービスの再起動に関するメッセージがポップアップ表示されます。

  9. [ OK]をクリックすると、それだけです

参照:https : //msdn.microsoft.com/en-us/library/dd327979.aspx

注:ローカルコンピューターまたはサーバーのネットワークファイアウォールによって接続が中断される場合があるため、「受信を許可する」および「送信を許可する」接続のルールを作成してください C:\Windows\System32\msdtc.exe


Windows Server 2012 R2でも動作します。明確な指示をありがとう。自分でこれを見つけたことはないでしょう!
jonazu

@jonazuがWindows Server 2012 R2の回答も更新しました:)
Shiv Singh

よくやったShivSingh!
スーパーコーダー2017年

の正しいパスmsdtc.exeは次のc:\windows\system32\msdtc.exe
とおりです。– firepol

1
少なくともクラスター化されたServer 2016ノードでは、UIを介して設定したときにこれらのプロパティが固定されないバグがあるようです。解決策は、レジストリでこれらのプロパティを手動で設定することですHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security。プロパティの詳細については、こちらをご覧ください
ポール、

102

MSDTCも必要ですか?発生しているエスカレーションは、多くの場合、単一のTransactionScope内に複数の接続を作成することによって引き起こされます。

必要な場合は、エラーメッセージの説明に従って有効にする必要があります。XPの場合:

  • 管理ツール->コンポーネントサービスに移動します。
  • コンポーネントサービス->コンピュータ->を展開します。
  • 右クリック->プロパティ-> MSDTCタブ
  • [セキュリティ構成]ボタンをクリックします

2
また、Windowsファイアウォールでポート135 TCPを開き、例外としてc:\ windows \ msdtc.exeを追加しました
Sameer Alibhai

20
単一のTransactionScope内に複数の接続を作成することによって引き起こされるエラーについてのコメントをありがとう。エラーが発生し、それがまさに問題でした。MSDTCを使用したくなかったため、誤った新しい接続を見つけ、既存の接続を再利用しました。ありがとう!
ジムマッキース、2010

10
Windows 7と8を使用していますが、「デフォルトコーディネーター」セクションしかありません。あなたが話しているセキュリティ構成はどこにありますか?
qdev76 2014年

2
1)ローカルDTCを右クリックしてプロパティを選択します2)セキュリティタブを開きます3)少なくともネットワークDTCアクセスをチェックし、リモートクライアントを許可し、インバウンドを許可します。
Rob Sedgwick

19

デバッグする最良の方法は、DTCPingと呼ばれるMicrosoftツールを使用することです

  1. ファイルをサーバー(DB)とクライアント(アプリケーションサーバー/クライアントpc)の両方にコピーします。
    • サーバーとクライアントで起動します
    • サーバーで:クライアントのnetbiosコンピューター名を入力し、DTC接続をセットアップしてみます
    • 両方のアプリケーションを再起動します。
    • クライアントで:サーバーのnetbiosコンピューター名を入力し、DTC接続のセットアップを試みます。

私は古い会社のネットワークでかなりの問題を抱えており、いくつかのヒントがあります。

  • 「Gethostbynameが失敗しました」というエラーメッセージが表示された場合、そのコンピュータはnetbios 名で他のコンピュータを見つけることができません。サーバーは、たとえばクライアントを解決してpingすることができますが、これはDNSレベルで機能します。netbiosルックアップレベルではありません。WINSサーバーを使用するか、LMHOST(ダーティー)を変更すると、この問題が解決します。
  • 「Acces Denied」というエラーが発生した場合は、セキュリティ設定が一致していません。msdtcのセキュリティタブを比較して、サーバーとクライアントを一致させる必要があります。もう1つ注目すべきことは、RestrictRemoteClients値です。OSのバージョン、さらに重要なのはService Packによって、この値は異なる場合があります。
  • その他の接続の問題:
    • サーバーとクライアント間のファイアウォールは、ポート135を介した通信を許可する必要があります。さらに重要なのは、両方のサイトから接続を開始できることです(サーバーのみが接続を開くと想定していたため、社内のファイアウォール担当者には多くの問題がありました)そのポートに)
    • プロトコルは、実際のトランザクション通信のために接続するランダムなポートを返します。ファイアウォールの人々はそれを好まず、ポートを特定の範囲に制限することを好みます。ファイアウォールで動作するようにRPC動的ポート割り当てを構成する方法で説明されているキーを使用して、RPC動的ポート生成を特定の範囲に制限できます

私の経験では、DTCPingがクライアントから開始され、サーバーから開始されたDTC接続をセットアップできる場合、トランザクションはもはや問題ではありません。


6

コントロールパネルのservices.mscからMSDTCをオンにする方法については、こちらもご覧ください。

トリガーが存在するサーバーで、MSDTCサービスをオンにする必要があります。これを行うには、[スタート]> [設定]> [コントロールパネル]> [管理ツール]> [サービス]をクリックします。「Distributed Transaction Coordinator」と呼ばれるサービスを見つけ、RIGHT CLICK(その上で選択)> Startをクリックします。


4

MSDTCは、サーバーとクライアントの両方の両方のシステムで有効にする必要があります。
また、RPCをブロックするシステム間にファイアウォールがないことを確認してください。
DTCTestは、他の問題のトラブルシューティングに役立つ素晴らしいlittアプリです。


これは新しい場所だと思いますmicrosoft.com/en-us/download/details.aspx?id=30746
Air2

4

@Dan、

トランザクションを機能させるためにmsdtcを有効にする必要はありませんか?

分散トランザクションのみ-複数の接続が関係するトランザクション。トランザクション内で1つの接続のみを開いていることを確認し、エスカレートしないようにしてください。パフォーマンスも大幅に向上します。


トランザクションを機能させるためにmsdtcを有効にする必要はありませんか?いずれにせよ、私が知る限り、複数の接続は行われていません。これらの手順はすでにクライアントPCで実行していますが、データベースサーバーでもこれらの手順を実行する必要がありますか?
ダン

@ Dan、ado.netトランザクションを使用している場合、DTCを有効にする必要はありません。分散トランザクションを使用している場合にのみ、サーバーでMSDTCを有効にする必要があります
Niraj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.