web-dev-qa-db-ja.com

MSDTC-基になるトランザクションマネージャーとの通信に失敗しました

エラーが発生します:

基になるトランザクションマネージャーとの通信に失敗しました

visual Studio 2010からアプリケーションを実行しようとしています。Googleでこの問題を検索し、このエラーを解決するために考えられるすべての解決策を試しました。

ここで、DTCプロパティを変更しました。

-- Network DTC Access
-- Allow Inbound
-- Allow Outbound
-- Allow Remote Administrator
-- Allow Remote Clients
-- No Authentication Required
-- Enable XA Transaction
-- Enable SNA LU 6.2 Transaction

誰かがこの問題の解決策を知っている場合は、私に知らせてください。

おかげでManoj Sitapara

24
M005

DTCがファイアウォールを介して通信できるようにします。

enter image description here

28
Tuyen Nguyen

ダウンロード DTCPing 分散トランザクションに関与するすべてのコンピュータにダウンロードして実行します。

ほとんどの場合、正確なエラーや何が問題なのか(同一のCIDなど)などがわかります。

考えられる理由:

  1. コンピューターはNetBIOS名で到達できません。この場合、それらのhostsファイルを調整してIP /ホスト名のマッピングを追加するか、ドメイン内にある場合はそれらのDNSエイリアスを追加する必要があります。
  2. サーバーはVMであり、同じVMインスタンスから複製されました。この場合、MSDTC CIDは同一であり、MSDTCをインストール/再インストールする必要があります(DTCpingがこれを通知します)。
16
Marcel N.

MSDTCトラブルシューティングガイド を確認してください。重複するCIDが潜在的な問題としてリストされています。次のPowershellスクリプトを使用して、重複するCIDを検出し、WinRMを使用して必要に応じてMSDTCを再インストールできます。

write-Host "Checking for duplicate CIDs and reinstalling MSDTC if needed."
$servers = "server1","server2","server3"
$CIDs = Invoke-Command -ComputerName $servers -ScriptBlock { gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { $_.Name } | Out-String -Stream } #Array of all CIDs on all servers
$UniqueCIDs = $CIDs | select -Unique
if($CIDs.Length -eq $UniqueCIDs.Length){
    Write-Output "All CIDs are unique, so we don't need to reinstall MSDTC"
} else {
    Write-Output "Found duplicate CIDs, so we need to reinstall MSDTC on all VMs"
    Invoke-Command -ComputerName $servers -ScriptBlock {
        write-output "`r`nUninstalling MSDTC to regenerate CIDs on $env:computername" 
        msdtc -uninstall | Write-Output
        sleep 25 #wait for previous command to finish
        write-output "`r`nReinstalling MSDTC to regenerate CIDs on $env:computername" 
        msdtc -install  | Write-Output
        sleep 25 #wait for previous command to finish
        write-output "`r`nSetting MSDTC service to automatic on $env:computername" 
        Set-Service msdtc -startuptype "auto"
        write-output "`r`nWARNING: $env:computername may need to be restarted for changes to take effect." 
    }
}
5
Greg Bray

DTCとMSMQをセットアップしようとしたときに通信エラーが発生しましたクラスター上。私の場合、根本的なエラーは「メモリ不足」でした。クラスターから別のサーバーにトランザクションメッセージを送信できましたが、そのサーバーからクラスターに返信できませんでした。私のサービスはこの例外をスローします:

System.Transactions.TransactionAbortedException: The transaction has aborted. 
---> System.Transactions.TransactionManagerCommunicationException: Communication 
with the underlying transaction manager has failed. ---> 
System.Runtime.InteropServices.COMException: Ran out of memory (Exception from HRESULT: 0x80000002)

この記事には非常にあいまいな解決策がありました: http://www.nervousadmin.com/category/Microsoft/windows/dtc/

要約する:

レジストリのHKLM\Cluster\ResourceTypes\Distributed Transaction Coordinatorの下にあるキーClusterDefaultResourceのguidがあり、実行可能ファイルへのDTCサービスのパスのguid引数に合わせる必要があります。

この問題の別の症状は、コンポーネントサービス管理コンソールを介してDTCプロパティにアクセスしようとすると、メモリ不足エラーが発生することです。コンソールツリーの[コンポーネントサービス]、[コンピューター]、[マイコンピューター]、[分散トランザクションコーディネーター]の順にクリックし、そこに表示されている各DTCを右クリックします。 GUIDが整列していない場合、これはエラーをスローします。

  • Services.mscを開きます。分散トランザクションコーディネーターを見つけます(2つある場合は、名前にguidが含まれているものを探します)。
  • そのDTCのプロパティを開きます。 「実行可能ファイルへのパス」からGUIDをコピーします
  • Regeditを開きます。 HKLM\Cluster\ResourceTypes\Distributed Transaction Coordinatorを見つけます
  • ClusterDefaultResource値を、コピーしたGUIDと比較します。それらが異なる場合は、次のステップで修正する必要があります。そうでない場合、これはあなたの答えではありません。
  • 現在の値をバックアップします。 ClusterDefaultResourceプロパティを編集します。services.mscDTCプロパティからコピーしたGUIDを貼り付けます。これは、クラスター内の各ノードで行う必要があります。
  • 運がよければ、これで問題は解決しました。
0
mandersen