2008-08-11 88 views
84

¿Es esto una pregunta válida? Tengo una aplicación .NET de Windows que está utilizando MSTDC y está lanzando una excepción:¿Cómo habilito MSDTC en SQL Server?

System.Transactions.TransactionManagerCommunicationException: acceso a la red para el Administrador de transacciones distribuidas (MSDTC) ha sido desactivado. Habilite DTC para el acceso de red en la configuración de seguridad para MSDTC utilizando la herramienta administrativa Servicios de componentes ---> System.Runtime.InteropServices.COMException (0x8004D024): El administrador de transacciones ha deshabilitado su soporte para transacciones de remotas/de red. (Excepción de HRESULT: 0x8004D024) en System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationLevel & isolationLevel, ITransactionShim & transactionShim) ....

Seguí the Kbalertz guide to enable MSDTC en la PC en la que está instalada la aplicación, pero el error todavía ocurre.

Me preguntaba si esto era un problema de base de datos? Si es así, ¿cómo puedo resolverlo?

+0

Si las soluciones mencionadas no resuelven el problema, consulte [este enlace] (http://stackoverflow.com/questions/10346367/mvc-3-the-msdtc-transact ion-manager-was-unable-to-pull-the-transaction-from-th) –

Respuesta

3

MSDTC debe estar habilitado en ambos sistemas, tanto servidor como cliente.
Además, asegúrese de que no haya un firewall entre los sistemas que bloquea RPC.
DTCTest es una buena aplicación litt que te ayuda a solucionar cualquier otro problema.

+0

http://ww2.sqldev.net/?folio=7POYGN0G2 no encontrado DTCTest. – Kiquenet

93

¿Incluso necesita MSDTC? La escalada que está experimentando a menudo se debe a la creación de múltiples conexiones dentro de un solo TransactionScope.

Si lo necesita, debe habilitarlo como se indica en el mensaje de error. En XP:

  • Vaya a Herramientas administrativas -> Servicios de componentes
  • Expanda Servicios de componentes -> Computadoras ->
  • Haga clic derecho -> Propiedades -> pestaña MSDTC
  • Pulse el botón de configuración de seguridad
+2

También en el firewall de Windows abrí el puerto 135 TCP y agregué c: \ windows \ msdtc.exe como excepción – Sameer

+18

Gracias por el comentario sobre el error causado por la creación de múltiples conexiones dentro de un solo TransactionScope. Estaba obteniendo el error y ese era exactamente el problema.No quería usar el MSDTC, así que encontré la nueva conexión errante y reutilicé una existente. ¡Gracias! –

+10

Estoy en Windows 7 y 8, y solo hay una sección de "Coordinador predeterminado". ¿Dónde puedo llegar a la configuración de seguridad de la que estás hablando? – qdev76

4

@ Dan,

Foro no necesita msdtc habilitado transacciones para trabajar?

Solo transacciones distribuidas: aquellas que implican más de una conexión. Asegúrese doblemente de que solo está abriendo una única conexión dentro de la transacción y no escalará. El rendimiento también será mucho mejor.

+0

¿No necesito msdtc habilitado para que funcionen las transacciones? De cualquier manera, las conexiones múltiples no se están haciendo por lo que yo sé. Ya he ejecutado esos pasos en la PC del cliente, ¿estás diciendo que también debería hacer esos pasos en el servidor de la base de datos? – Dan

+0

@Dan, no es necesario que habilite DTC si está utilizando transacciones de ado.net. Debe habilitar MSDTC en el servidor solo si está utilizando las transacciones distribuidas – Niraj

17

He encontrado que la mejor manera de depuración es utilizar la herramienta de Microsoft llamada DTCPing

  1. Copia el archivo en el servidor (DB) y el cliente (servidor de aplicaciones/PC del cliente)
    • iniciarlo en el servidor y el cliente
    • en el servidor: rellenar el nombre de NetBIOS de cliente equipo y tratar de establecer una conexión DTC
    • Reiniciar ambas aplicaciones.
    • En el cliente: rellenar el nombre de NetBIOS del servidor de la computadora y tratar de establecer una conexión DTC

que he tenido mi trato de tarifas de los problemas en nuestra vieja red de la empresa, y tengo algunos consejos:

  • si recibe el mensaje de error "Gethostbyname fallido" significa que el equipo no puede encontrar otro equipo por su nombre NetBIOS . El servidor podría, por ejemplo, resolver y hacer ping al cliente, pero eso funciona en un nivel de DNS. No en un nivel de búsqueda de netbios. Usar servidores WINS o cambiar el LMHOST (sucio) resolverá este problema.
  • si aparece el mensaje "Acceso denegado", la configuración de seguridad no coincide. Debe comparar la pestaña de seguridad para el msdtc y conseguir que el servidor y el cliente coincidan. Otra cosa a mirar es el valor RestrictRemoteClients. Dependiendo de su versión del sistema operativo y, lo que es más importante, del Service Pack, este valor puede ser diferente.
  • Otros problemas de conexión:
    • El servidor de seguridad entre el servidor y el cliente debe permitir la comunicación a través del puerto 135. Y lo más importante, la conexión puede ser iniciada desde ambos sitios (que tenía un montón de problemas con la gente de firewall en mi empresa porque asumieron que solo el servidor abriría una conexión en ese puerto)
    • El protocolo devuelve un puerto aleatorio al que conectarse para la comunicación de transacción real. A los servidores de seguridad no les gusta eso, les gusta restringir los puertos a un cierto rango. Puede restringir la generación del puerto dinámico RPC a un cierto rango utilizando las teclas como se describe en How to configure RPC dynamic port allocation to work with firewalls.

En mi experiencia, si el DTCPing es capaz de configurar una conexión DTC iniciada desde el cliente e iniciado desde el servidor, sus transacciones no son el problema más.

4

También se puede ver here sobre cómo activar MSDTC desde los servicios del panel de control .msc.

En el servidor donde reside el activador, debe activar el servicio MSDTC . Puede hacerlo haciendo clic en INICIO> AJUSTES> PANEL DE CONTROL> HERRAMIENTAS ADMINISTRATIVAS> SERVICIOS. Busque el servicio llamado 'Coordinador de transacciones distribuidas' y haga clic con el botón derecho (en él y seleccione )> Iniciar.

90

Uso esto para Windows Server 2008 R2 y Windows Server 2012 R2

  1. Haga clic Comienza, haga clic Run, tipo dcomcnfg y haga clic en OK para abrir Servicios de componentes.

  2. En el árbol de consola, expanda Servicios de componentes , haga clic para expandir Computadoras, haga clic para expandir Mi PC, haga clic para expandir Coordinador de transacciones distribuidas y haga clic en DTC local.

  3. Haga clic derecho local DTC y haga clic en Propiedades para mostrar las propiedades de DTC cuadro de diálogo local.

  4. Haga clic en la ficha Security.

  5. Marca de verificación "Acceso a DTC de red" casilla de verificación.

  6. Finalmente marca de verificación "Permitir entrantes" y "Permitir salientes" casillas de verificación.

  7. Haga clic en Aplicar , OK.

  8. Aparecerá un mensaje sobre reiniciando el servicio.

  9. Haga clic en OK y eso es todo.

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

Nota: A veces el servidor de seguridad de red en el equipo local o el servidor podría interrumpir su conexión así que asegúrese de crear reglas para "Permitir entrantes" y "Permitir Salida " conexión para c:\windows\msdtc.exe

+0

Works para Windows Server 2012 R2, también. Gracias por las instrucciones claras. ¡Nunca hubiera encontrado esto por mi cuenta! – jonazu

+0

@jonazu ahora también tengo una respuesta actualizada para Windows Server 2012 R2 :) –

+0

¡Buen trabajo ShivSingh! –