El administrador de transacciones ha deshabilitado su soporte para transacciones remotas / de red

Estoy usando SQL Server y ASP.NET. Tengo la siguiente función:

Using js = daoFactory.CreateJoinScope() Using tran = New Transactions.TransactionScope() '... tran.Complete() End Using End Using 

Sin embargo, la excepción ‘ El administrador de transacciones ha deshabilitado su soporte para transacciones remotas / de red. ‘ es aventado.

Descripción de JoinScope:

 Public Class JoinScope Implements IJoinScope Implements IDisposable '... End Class 

He trabajado de esta manera en otra aplicación con el mismo entorno sin ningún problema, pero aquí tengo este problema. ¿Qué podría hacer para solucionar el problema?

Asegúrese de que el servicio “Coordinador de transacciones distribuidas” se ejecuta tanto en la base de datos como en el cliente. También asegúrese de marcar “Acceso a DTC de red”, “Permitir cliente remoto”, “Permitir entrada / salida” y “Habilitar TIP”.

Para habilitar el acceso a DTC de red para las transacciones de MS DTC

  1. Abra el complemento Servicios de componentes.

    Para abrir Servicios de componentes, haga clic en Inicio. En el cuadro de búsqueda, escriba dcomcnfg y luego presione ENTER.

  2. Expanda el árbol de la consola para ubicar el DTC (por ejemplo, DTC local) para el que desea habilitar el acceso de red MS DTC.

  3. En el menú Acción, haga clic en Propiedades.

  4. Haga clic en la pestaña Seguridad y realice los siguientes cambios: En Configuración de seguridad, seleccione la checkbox Acceso a DTC de red.

    En Transaction Manager Communication, seleccione las casillas de verificación Permitir entrante y Permitir saliente.

Estaba recibiendo este problema intermitentemente, había seguido las instrucciones aquí y otras similares en otros lugares. Todo fue configurado correctamente.

Esta página: http://sysadminwebsite.wordpress.com/2012/05/29/9/ me ayudó a encontrar el problema.

Básicamente, tenía CID duplicados para el MSDTC en ambos servidores. HKEY_CLASSES_ROOT \ CID

Consulte la sección http://msdn.microsoft.com/en-us/library/aa561924.aspx. Asegúrese de que a MSDTC se le asigna un valor de CID único.

Estoy trabajando con servidores virtuales y a nuestro equipo de servidores le gusta usar la misma imagen para cada servidor. Es una solución simple y no necesitamos un reinicio. Pero el servicio DTC sí necesitaba configuración para el arranque automático y no tuvo que iniciarse después de la reinstalación.

Comentario de otra respuesta : “asegúrese de usar la misma conexión abierta para todas las llamadas a la base de datos dentro de la transacción. – Magnus” (No sé cómo vincular comentarios)

Nuestros usuarios se almacenan en un DB separado de los datos con los que estaba trabajando en las transacciones. Al abrir la conexión db para obtener el usuario estaba causando este error para mí. Mover la otra conexión db y la búsqueda del usuario fuera del scope de la transacción corrigió el error.

Tenía un procedimiento de almacenamiento que llamaba a otra tienda Procedimiento en “servidor vinculado”. Cuando lo ejecutaba en sms, estaba bien, pero cuando lo llamo en la aplicación (Entidad Marco), recibí este error. Este artículo me ayudó y usé este script:

 EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ; 

para obtener más detalles, consulte esto: Servidor vinculado: el administrador de transacciones asociado ha deshabilitado su soporte para transacciones remotas / de red

En mi caso, la excepción se lanzaba porque estaba tratando de crear una nueva instancia de conexión dentro de un TransactionScope en una conexión ya existente:

Ejemplo:

 void someFunction() { using (var db = new DBContext(GetConnectionString())) { using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { someOtherFunction(); // This function opens a new connection within this transaction, causing the exception. } } } void someOtherFunction() { using (var db = new DBContext(GetConnectionString())) { db.Whatever // <- Exception. } } 

Publiqué la siguiente solución aquí porque después de algunas búsquedas aquí es donde aterrice, para que otros también lo hagan. Intenté usar EF 6 para llamar a un procedimiento almacenado, pero tuve un error similar porque el procedimiento almacenado tenía un servidor vinculado que se utilizaba.

La operación no se pudo realizar porque el proveedor OLE DB _ para el servidor vinculado _ no pudo comenzar una transacción distribuida

El administrador de transacciones asociado ha deshabilitado su soporte para transacciones remotas / de red *

Saltar a SQL Client solucionó mi problema, lo que también me confirmó que se trataba de algo de EF.

Intento basado en el método generado por el modelo EF:

 db.SomeStoredProcedure(); 

Intento basado en ExecuteSqlCommand:

 db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]"); 

Con:

 var connectionString = db.Database.Connection.ConnectionString; var connection = new System.Data.SqlClient.SqlConnection(connectionString); var cmd = connection.CreateCommand(); cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]"; connection.Open(); var result = cmd.ExecuteNonQuery(); 

Ese código puede acortarse, pero creo que esa versión es un poco más conveniente para la depuración y el paso.

No creo que Sql Client sea necesariamente una opción preferida, pero sentí que al menos valía la pena compartirlo si alguien más tiene problemas similares que aterriza aquí en google.

El código anterior es C #, pero el concepto de intentar cambiar a Sql Client aún se aplica. Por lo menos, será diagnóstico intentar hacerlo.