web-dev-qa-db-fra.com

MSDTC - La communication avec le gestionnaire de transactions sous-jacent a échoué

Je reçois une erreur: 

la communication avec le gestionnaire de transactions sous-jacent a échoué

lorsque j'essaie d'exécuter mon application à partir de visual studio 2010. J'ai recherché ce problème sur Google, j'ai essayé toutes les solutions possibles pour résoudre cette erreur.

Ici, j'ai apporté des modifications à mes propriétés 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

Faites-le moi savoir si quelqu'un connaît la solution à ce problème.

Merci Manoj Sitapara

21
M005

Essayez de permettre à DTC de communiquer via le pare-feu.

enter image description here

26
Tuyen Nguyen

Téléchargez DTCPing sur tous les ordinateurs impliqués dans la transaction distribuée et exécutez-la.

La plupart du temps, cela vous donnera l'erreur exacte et ce qui ne va pas (comme un CID identique), etc.

Raisons possibles:

  1. Les ordinateurs ne sont pas accessibles par nom NetBIOS. Dans ce cas, vous devez soit ajuster leur fichier hosts pour ajouter des mappages IP/nom d'hôte ou, si vous vous trouvez dans un domaine, leur ajouter des alias DNS.
  2. Les serveurs sont des ordinateurs virtuels et ils ont été clonés à partir de la même instance VM. Dans ce cas, les CID MSDTC sont identiques et vous devez installer/réinstaller MSDTC (DTCping vous le dira).
14
Marcel N.

Consultez le Guide de dépannage MSDTC , qui répertorie les CID en double en tant que problème potentiel. Vous pouvez utiliser le script Powershell suivant pour détecter les CID en double et réinstaller MSDTC si nécessaire avec WinRM:

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." 
    }
}
4
Greg Bray

J'ai eu une erreur de communication en essayant de configurer DTC et MSMQ sur un cluster. Dans mon cas, l'erreur sous-jacente était "manque de mémoire." J'ai pu envoyer des messages transactionnels du cluster vers un autre serveur, mais pas de ce serveur vers le cluster. Mon service lève cette exception:

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)

Cet article avait la solution très obscure: http://www.nervousadmin.com/category/Microsoft/windows/dtc/

Résumer:

Il existe dans le registre un guide pour la clé ClusterDefaultResource sous HKLM\Cluster\ResourceTypes\Distributed Transaction Coordinator qui doit être aligné sur l'argument GUID du chemin du service DTC vers l'exécutable.

Un autre symptôme de ce problème est que vous obtiendrez une erreur de manque de mémoire si vous essayez d'accéder aux propriétés DTC via la console de gestion des services de composants. Recherchez dans l’arborescence de la console sous Services de composant/Ordinateurs/Poste de travail/Coordinateur de transactions distribuées et cliquez avec le bouton droit de la souris sur chacun des DTC répertoriés dans la liste. Cela jettera l'erreur si vos guides ne sont pas alignés.

  • Ouvrez services.msc. Trouvez le coordinateur de transaction distribuée (s'il y en a deux, vous cherchez celui avec le guid dans son nom)
  • Ouvrez les propriétés de ce DTC. Copier le GUID du 'chemin d'accès à l'exécutable'
  • Ouvrez regedit. Rechercher HKLM\Cluster\ResourceTypes\Coordinated Transaction Coordinator
  • Comparez la valeur ClusterDefaultResource au GUID que vous avez copié. S'ils sont différents, la prochaine étape devrait régler le problème. Sinon, ce n'est pas ta réponse.
  • Sauvegardez la valeur actuelle. Editez la propriété ClusterDefaultResource: collez le GUID que vous avez copié à partir des propriétés DTC de services.msc. Vous devrez le faire sur chaque nœud de votre cluster.
  • Avec de la chance, cela a résolu votre problème.
0
mandersen