【.NET】【MSDTC】例外「基本トランザクション マネージャとの通信が失敗しました」が発生

■ 現象

デバッグ中に、以下の例外が発生。

基本トランザクション マネージャとの通信が失敗しました。

MSDTC トランザクション マネージャーは、通信の問題のため、送信元のトランザクション マネージャーから
トランザクションをプルできませんでした。
原因として、ファイアウォールが存在していて MSDTC プロセスの例外がないこと、
2 台のコンピューターが NetBIOS 名でお互いを識別できないこと、
または 2 つのトランザクション マネージャーのいずれかでネットワーク トランザクションのサポートが
有効になっていないことが考えられます。 (HRESULT からの例外: 0x8004D02B)

以下のコールスタックと同じ。
http://incomesoft.net/baseTransactionMgrConctionErr.aspx

■ 発生環境

 * OS : Win7
 * VS : Visual Studio 2008 / C# / Framework 3.5
 * DB : SQL Server 2008 R2

■ 原因

 * 調査中
 * メッセージから判断して、ファイアウォールでMSDTCプログラムのポートが許可されていない可能性がある

■ 対策(仮)

以下の手順で現象がかなり起こりづらくなった(ただし、たまにまだ起こる...)

 [1] コントロールパネルで、[windowsファイアウォール]を選択
 [2][Windowsファイアウォールを介したプログラムまたは機能を許可する]を選択
 [3] 「分散トランザクションコーディネータ」にチェックを入れる(ドメイン~プライベートにもチェックを入れる)
 [4] 「OK」押下
http://www.bunkerhollow.com/blogs/matt/archive/2009/10/26/network-access-for-distributed-transaction-manager-msdtc-has-been-disabled.aspx
以下の設定も必要だと思う。

 [1] [コントロールパネル]-[管理ツール]-[コンポーネント サービス]を選択
     (または、[スタート]-[ファイル名を指定して実行する]を選択し「dcomcnfg」を入力)
 [2] [コンポーネント サービス] ウィンドウで、[コンポーネント サービス]-[コンピュータ]-[マイ コンピュータ]-[Distributed Transaction Coordinator]-[ローカル DTC]を選択。
 [3] その状態で、右クリックして、プロパティをクリック。
 [4] MSDTC タブの [セキュリティの構成] ボタンを押下。
 [5] 以下を設定

 * [ネットワーク DTC アクセス]にチェック。
 * クライアント及び管理の [リモート クライアントを許可する]と[リモート管理を許可する]にチェック。
 * トランザクション マネージャ通信の [受信を許可する]と[送信を許可する]にチェック。
 * その下のラジオボタンは、[認証を必要としない]を選択。
 * [XA トランザクションを有効にする]をチェック。
http://naoko.wankuma.com/beginner/beginner_0010_winDbApp04.html
http://www.logistech.co.jp/techtips/msdtc.html
http://kametaro.wordpress.com/2008/04/17/biztalk-server%E3%81%AEmsdtc%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%80%80%EF%BC%88%E4%B8%BB%E3%81%ABsql-server%E3%81%AE%E5%88%86%E6%95%A3%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3/


関連記事

MSDTC に関するトラブル

例外「サーバー ‘XXXXX’ の MSDTC は使用できません。」が発生
https://blogs.yahoo.co.jp/dk521123/29737310.html