vinculado una transaction transacción transacciones servidor pudo mensaje iniciar habilitar distribuidas distribuida devolvió active linq-to-sql transactions transactionscope msdtc

linq-to-sql - una - msdtc habilitar



Error TransactionScope contra Sql Server 2000-El administrador de transacciones asociado ha deshabilitado su soporte para transacciones remotas/de red (4)

Estoy tratando de configurar una transacción simple para mis acciones Linq-to-Sql contra mi base de datos Sql 2000. Usando TransactionScope se ve así:

using (TransactionScope transaction = new TransactionScope()) { try { Store.DBDataContext dc = new Store.DBDataContext(); Store.Product product = GetProduct("foo"); dc.InsertOnSubmit(product); dc.SubmitChanges(); transaction.Complete(); } catch (Exception ex) { throw ex; } }

Sin embargo, sigo recibiendo el siguiente error:

El administrador de transacciones asociado ha deshabilitado su soporte para transacciones remotas / de red. (Excepción de HRESULT: 0x8004D025)

Pero, si configuro la transacción usando una transacción tradicional, funciona bien. Así que esto funciona bien:

Store.DBDataContext dc = new Store.DBDataContext(); try { dc.Connection.Open(); dc.Transaction = dc.Connection.BeginTransaction(); Store.Product product = GetProduct("foo"); dc.InsertOnSubmit(product); dc.SubmitChanges(); dc.Transaction.Commit(); } catch (Exception ex) { dc.Transaction.Rollback(); throw ex; } finally { dc.Connection.Close(); dc.Transaction = null; }

Me pregunto si TransactionScope está haciendo algo diferente bajo las coberturas que mi segunda implementación. Si no, ¿qué estoy perdiendo al no usar TransactionScope? Además, cualquier orientación sobre qué está causando el error sería bueno también. Confirmé que MSDTC se está ejecutando en el servidor sql y en mi máquina cliente.


Eche un vistazo aquí:

Transacciones rápidas con System.Transactions y Microsoft SQL Server 2000 http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx

Y aquí:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=230390&SiteID=1

Primero verifique que el servicio "Distribute Transaction Coordinator" se esté ejecutando tanto en la computadora servidor de la base de datos como en las computadoras cliente
1. Vaya a "Herramientas administrativas> Servicios"
2. Active el servicio "Distribuir coordinador de transacciones" si no se está ejecutando

Si se está ejecutando y la aplicación del cliente no está en la misma computadora que el servidor de la base de datos, en la computadora que ejecuta el servidor de la base de datos
1. Vaya a "Herramientas administrativas> Servicios de componentes"
2. En el árbol de navegación izquierdo, vaya a "Servicios de componentes> Computadoras> Mi PC" (es posible que deba hacer doble clic y esperar porque algunos nodos necesitan tiempo para expandirse)
3. Haga clic derecho en "Mi PC", seleccione "Propiedades"
4. Seleccione la pestaña "MSDTC"
5. Haga clic en "Configuración de seguridad"
6. Asegúrese de marcar "Acceso a DTC de red", "Permitir cliente remoto", "Permitir entrada / salida", "Habilitar CONSEJO" (Algunas opciones pueden no ser necesarias, intente obtener su configuración)
7. El servicio se reiniciará
8. PERO PUEDES NECESITAR REINICIAR TU SERVIDOR SI TODAVÍA NO FUNCIONA (Esto es lo que me volvía loco antes)

En su computadora cliente use el mismo procedimiento anterior para abrir la configuración de "Configuración de seguridad", asegúrese de marcar la opción "Acceso a DTC de red", "Permitir entrada / salida", reiniciar el servicio y la computadora si es necesario.

En su administrador de servicios de SQL Server, haga clic en el menú desplegable "Servicio", seleccione "Distribuir coordinador de transacciones", también debería estar ejecutándose en su computadora servidor.


más tenga en cuenta que: - Guía de configuración del servidor Habilite el acceso COM + de la red (Windows Server 2003) Inicio ==> Panel de control ==> Agregar o quitar programas ==> Agregar / quitar componentes de Windows, seleccionar servidor de aplicaciones y luego hacer clic en Detalles. Haga clic en Habilitar acceso COM + de red y luego en Aceptar. Haga clic en Siguiente y luego en Finalizar.
- Si entre 2 servidores tiene firewall, abra el firewall para ambos dentro / fuera en este puerto de rango: Haga clic en Inicio ==> Paneles de control ==> Herramientas administrativas ==> Servicios de componentes. Expanda el servicio de componentes, expanda computadoras, haga clic con el botón derecho en Mi PC y elija Propiedades. En la ventana Propiedades de Mi PC, haga clic en la pestaña Protocolo predeterminado, haga clic en TCP / IP orientado a conexión y elija propiedades. en la nueva ventana, haga clic en Agregar y escriba el nuevo rango de puertos DTC. Haga clic en Aceptar para aplicar estos cambios. El servidor debe reiniciarse para que el nuevo cambio tenga efecto


La implementación de DatabaseTransactionAdapter en la publicación de Florin Lazar a la que Keith Sirmons me señaló parece ser la solución. Aquí está mi código que lo llama:

Store.DBDataContext dc = new Store.DBDataContext(); using (TransactionScope transaction = new TransactionScope()) { try { var dbAdapter = new DatabaseTransactionAdapter(dc.Connection); dc.Connection.Open(); dbAdapter.Begin(); dc.Transaction = (SqlTransaction)dbAdapter.Transaction; Store.Product product = GetProduct("foo"); dc.InsertOnSubmit(product); dc.SubmitChanges(); transaction.Complete(); } catch (Exception ex) { throw ex; } }

Lo único que me inquieta es que no estoy cerrando explícitamente la conexión a pesar de que no está declarada dentro de una declaración ''using''.

Pero según Florin Lazar, eso es a propósito.

Y tampoco debe cerrar la conexión, porque la conexión debe permanecer abierta hasta que se complete la transacción, lo que ocurre después de que finaliza la instrucción "using". El adaptador tomará posesión de la vida útil de la conexión y la cerrará cuando haya terminado.


Los pasos para habilitar esto en Windows 2008 o posterior son:

Primero verifique que el servicio "Distribute Transaction Coordinator" se esté ejecutando tanto en la computadora servidor de la base de datos como en las computadoras cliente

  1. Vaya a "Herramientas administrativas> Servicios"
  2. Active el servicio "Distribuir coordinador de transacciones" si no se está ejecutando

Si se está ejecutando y la aplicación del cliente no está en la misma computadora que el servidor de la base de datos, en la computadora que ejecuta el servidor de la base de datos

  1. Vaya a "Herramientas administrativas> Servicios de componentes"
  2. En el árbol de navegación izquierdo, vaya a "Servicios de componentes> Computadoras> Mi PC> Coordinador de transacciones distribuidas" (es posible que deba hacer doble clic y esperar ya que algunos nodos necesitan tiempo para expandirse)
  3. Haga clic derecho en "DTC local", seleccione "Propiedades"
  4. Seleccione la pestaña "Seguridad"
  5. Asegúrese de marcar "Acceso a DTC de red", "Permitir cliente remoto", "Permitir entrada / salida"
  6. El servicio se reiniciará
  7. PERO PUEDE NECESITAR REINICIAR SU SERVIDOR SI TODAVÍA NO FUNCIONA (Esto es lo que me volvía loco antes)

En su computadora cliente use el mismo procedimiento anterior para abrir la configuración de "Configuración de seguridad", asegúrese de marcar la opción "Acceso a DTC de red", "Permitir entrada / salida", reiniciar el servicio y la computadora si es necesario.

En su administrador de servicios de SQL Server, haga clic en el menú desplegable "Servicio", seleccione "Distribuir coordinador de transacciones", también debería estar ejecutándose en su computadora servidor.