Come si abilita MSDTC su SQL Server?


106

È anche una domanda valida? Ho un'app .NET per Windows che utilizza MSTDC e genera un'eccezione:

System.Transactions.TransactionManagerCommunicationException: l'accesso alla rete per Distributed Transaction Manager (MSDTC) è stato disabilitato. Abilita DTC per l'accesso alla rete nella configurazione di sicurezza per MSDTC utilizzando lo strumento di amministrazione di Servizi componenti ---> System.Runtime.InteropServices.COMException (0x8004D024): il gestore delle transazioni ha disabilitato il supporto per le transazioni remote / di rete. (Eccezione da HRESULT: 0x8004D024) in System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationLevel & transactionLevel ....

Ho seguito la guida di Kbalertz per abilitare MSDTC sul PC su cui è installata l'app, ma l'errore si verifica comunque.

Mi chiedevo se si trattasse di un problema di database? In caso affermativo, come posso risolverlo?


Se le soluzioni menzionate non risolvono il problema, controlla questo link
Shahab J

Risposte:


127

Usalo per Windows Server 2008 r2 e Windows Server 2012 R2

  1. Fare clic su Start , scegliere Esegui , digitare dcomcnfg e quindi fare clic su OK per aprire Servizi componenti .

  2. Nella struttura della console fare clic per espandere Servizi componenti , fare clic per espandere Computer , fare clic per espandere Risorse del computer , fare clic per espandere Distributed Transaction Coordinator e quindi fare clic su DTC locale .

  3. Fare clic con il pulsante destro del mouse su DTC locale e fare clic su Proprietà per visualizzare la finestra di dialogo Proprietà DTC locale .

  4. Fare clic sulla scheda Protezione .

  5. Segno di spunta "Accesso alla rete DTC" .

  6. Infine, seleziona le caselle di controllo "Consenti in entrata" e "Consenti in uscita" .

  7. Fare clic su Applica , OK .

  8. Apparirà un messaggio sul riavvio del servizio.

  9. Fare clic su OK e questo è tutto.

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

Nota: a volte il firewall di rete sul computer locale o sul server potrebbe interrompere la connessione, quindi assicurati di creare regole per "Consenti connessione in entrata" e "Consenti in uscita" perC:\Windows\System32\msdtc.exe


Funziona anche per Windows Server 2012 R2. Grazie per le chiare istruzioni. Non l'avrei mai trovato da solo!
jonazu

@jonazu ora ho aggiornato anche la risposta per Windows Server 2012 R2 :)
Shiv Singh

Bel lavoro ShivSingh!
Super Coder

Il percorso corretto di msdtc.exeè:c:\windows\system32\msdtc.exe
firepol

1
Sembra esserci un bug in cui queste proprietà non si bloccano quando impostate tramite l'interfaccia utente, almeno sui nodi Server 2016 in cluster. La soluzione è impostare queste proprietà manualmente nel Registro: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Maggiori informazioni sulle proprietà qui .
Paul il

102

Hai anche bisogno di MSDTC? L'escalation che stai riscontrando è spesso causata dalla creazione di più connessioni all'interno di un singolo TransactionScope.

Se ne hai bisogno, devi abilitarlo come descritto nel messaggio di errore. Su XP:

  • Vai a Strumenti di amministrazione -> Servizi componenti
  • Espandi Servizi componenti -> Computer ->
  • Fare clic con il pulsante destro del mouse -> Proprietà -> scheda MSDTC
  • Premi il pulsante Configurazione di sicurezza

2
Anche in Windows Firewall ho aperto la porta 135 TCP e ho aggiunto c: \ windows \ msdtc.exe come eccezione
Sameer Alibhai

20
Grazie per il commento sull'errore causato dalla creazione di più connessioni all'interno di un singolo TransactionScope. Stavo ricevendo l'errore e questo era esattamente il problema. Non volevo usare MSDTC, quindi ho trovato la nuova connessione errata e ne ho riutilizzata una esistente. Grazie!
Jim McKeeth

10
Sono su Windows 7 e 8 e c'è solo una sezione "Coordinatore predefinito". Dove posso accedere alla configurazione di sicurezza di cui parli?
qdev76

2
1) Fare clic con il pulsante destro del mouse su DTC locale e scegliere Proprietà 2) Aprire la scheda di sicurezza 3) Selezionare almeno Accesso DTC di rete, Consenti client remoti e Consenti ingresso.
Rob Sedgwick

19

Ho scoperto che il modo migliore per eseguire il debug è utilizzare lo strumento Microsoft chiamato DTCPing

  1. Copiare il file sia sul server (DB) che sul client (Application server / client pc)
    • Avvialo sul server e sul client
    • Sul server: inserisci il nome del computer netbios del client e prova a impostare una connessione DTC
    • Riavvia entrambe le applicazioni.
    • Sul client: inserisci il nome del computer netbios del server e prova a impostare una connessione DTC

Ho avuto problemi con la nostra vecchia rete aziendale e ho alcuni suggerimenti:

  • se viene visualizzato il messaggio di errore "Gethostbyname failed" significa che il computer non riesce a trovare l'altro computer tramite il suo nome netbios . Il server, ad esempio, potrebbe risolvere e eseguire il ping del client, ma funziona a livello DNS. Non a livello di ricerca netbios. L'utilizzo di server WINS o la modifica di LMHOST (sporco) risolverà questo problema.
  • se ricevi un errore "Accesso negato", le impostazioni di sicurezza non corrispondono. È necessario confrontare la scheda di sicurezza per msdtc e ottenere la corrispondenza tra server e client. Un'altra cosa da considerare è il valore RestrictRemoteClients . A seconda della versione del sistema operativo e, soprattutto, del Service Pack, questo valore può essere diverso.
  • Altri problemi di connessione:
    • Il firewall tra il server e il client deve consentire la comunicazione sulla porta 135. E, cosa più importante, la connessione può essere avviata da entrambi i siti (ho avuto molti problemi con gli addetti al firewall della mia azienda perché pensavano che solo il server avrebbe aperto una connessione su quel porto)
    • Il protocollo restituisce una porta casuale a cui connettersi per la comunicazione della transazione reale. Alla gente del firewall non piace, a loro piace limitare le porte a un certo intervallo. È possibile limitare la generazione della porta dinamica RPC a un determinato intervallo utilizzando le chiavi come descritto in Come configurare l'allocazione dinamica della porta RPC per il funzionamento con i firewall .

Nella mia esperienza, se DTCPing è in grado di impostare una connessione DTC avviata dal client e avviata dal server, le tue transazioni non sono più il problema.


6

Può anche vedere qui come attivare MSDTC dal services.msc del pannello di controllo.

Sul server in cui risiede il trigger, è necessario attivare il servizio MSDTC. È possibile fare clic su START> IMPOSTAZIONI> PANNELLO DI CONTROLLO> STRUMENTI AMMINISTRATIVI> SERVIZI. Trova il servizio chiamato "Distributed Transaction Coordinator" e FAI CLIC DESTRO (su di esso e seleziona)> Avvia.



4

@ Dan,

Non è necessario che msdtc sia abilitato affinché le transazioni funzionino?

Solo transazioni distribuite: quelle che coinvolgono più di una singola connessione. Assicurati doppiamente di aprire una sola connessione all'interno della transazione e che non si intensificherà: anche le prestazioni saranno molto migliori.


Non è necessario che msdtc sia abilitato affinché le transazioni funzionino? Ad ogni modo, per quanto ne so, non vengono effettuate più connessioni. Ho già eseguito questi passaggi sul PC client, stai dicendo che dovrei eseguire questi passaggi anche sul server del database?
Dan

@ Dan, non è necessario abilitare DTC se si utilizzano transazioni ado.net. È necessario abilitare MSDTC sul server solo se si utilizzano transazioni distribuite
Niraj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.