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

86

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 desactivado su soporte para transacciones remotas / de red. ' es aventado.

Descripción de JoinScope:

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

Así he trabajado en otra aplicación con el mismo entorno sin problema, pero aquí tengo este problema. ¿Qué puedo hacer para solucionar el problema?

Lajos Arpad
fuente
Hice los pasos que Magnus sugirió primero para asegurarme de que tenía todas las bases cubiertas, por así decirlo, y luego logré obtener un error que sugería que habilitaba clr en SQL Server, y eso funcionó para mí. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Respuestas:

141

Asegúrese de que el servicio "Coordinador de transacciones distribuidas" se esté ejecutando tanto en la base de datos como en el cliente. También asegúrese de marcar "Acceso DTC de red", "Permitir cliente remoto", "Permitir entrante / saliente" y "Habilitar TIP".

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

  1. Abra el complemento Servicios de componentes.

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

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

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

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

    En Transaction Manager Communication, seleccione las casillas de verificación Permitir entrantes y Permitir salientes.

Magnus
fuente
3
Gracias, Magnus. Debe ser una configuración de la aplicación, porque este tipo de transacción funcionó con las mismas computadoras, lo que significa que este problema no está relacionado con la máquina.
Lajos Arpad
Sí, lo hice. Lanza la misma excepción.
Lajos Arpad
Supongo que tiene que ver con lo que está haciendo realmente dentro de TransactionScope.
Magnus
Además, necesito el alcance de la unión, porque quiero que esta transacción se envíe como una solicitud única al servidor de la base de datos.
Lajos Arpad
13
asegúrese de utilizar la misma conexión abierta para todas las llamadas a la base de datos dentro de la transacción.
Magnus
11

Recibía este problema de forma intermitente, había seguido las instrucciones aquí y otras muy similares en otros lugares. Todo se configuró 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: http://msdn.microsoft.com/en-us/library/aa561924.aspx sección Asegúrese de que a MSDTC se le asigne 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 reiniciar. Pero el servicio DTC necesitaba configurarse en Inicio automático y debía iniciarse después de la reinstalación.

Tod
fuente
9

Tuve un procedimiento de tienda que llama a otro procedimiento de tienda en "servidor vinculado". Cuando lo ejecuto en ssms estaba bien, pero cuando lo llamo en la aplicación (Por Entity Framework), 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 del socio ha desactivado su soporte para transacciones remotas / de red

Amirhossein Yari
fuente
1
Un enlace a una solución es bienvenido, pero asegúrese de que su respuesta sea útil sin él: agregue contexto alrededor del enlace para que sus compañeros usuarios tengan una idea de qué es y por qué está allí, luego cite la parte más relevante de la página. volver a enlazar en caso de que la página de destino no esté disponible. Las respuestas que son poco más que un enlace pueden eliminarse.
Petter Friberg
1
Esto resolvió mi problema, así que gracias por proporcionar esto. No sé por qué obtuvo un voto de -1, ya que funcionó para rectificar mi problema específico.
Boyd P
6

En mi escenario, la excepción se lanzó 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.
    }
}
Daniel Minnaar
fuente
3

Comentario de la 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"

Nuestros usuarios se almacenan en una base de datos separada de los datos con los que estaba trabajando en las transacciones. Abrir la conexión db para obtener el usuario me estaba causando este error. Mover la otra conexión de base de datos y la búsqueda de usuarios fuera del alcance de la transacción solucionó el error.

Bakanekobrain
fuente
1

Publico la siguiente solución aquí porque después de algunas búsquedas, aquí es donde aterricé, por lo que otros también pueden hacerlo. Estaba tratando de usar EF 6 para llamar a un procedimiento almacenado, pero tuve un error similar porque el procedimiento almacenado tenía un servidor vinculado .

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 del socio ha desactivado su soporte para transacciones remotas / de red *

Saltar al cliente SQL solucionó mi problema, lo que también me confirmó que era una cosa 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 se puede acortar, pero creo que la versión es un poco más conveniente para depurar y avanzar.

No creo que Sql Client sea necesariamente una opción preferida, pero sentí que al menos valía la pena compartir esto si alguien más que tiene problemas similares llega aquí por 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.

Greg
fuente
Interesante. Creo que es posible que desee editar la solución con código VB (hay traductores de código disponibles), por lo que coincidiría con las etiquetas de la pregunta. Sin embargo, lo voté a favor.
Lajos Arpad
1

Si no pudo encontrar el DTC local en los servicios de componentes, intente ejecutar primero este script de PowerShell:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

¡Y aparece!

Fuente: el administrador de transacciones del socio ha inhabilitado su soporte para transacciones remotas / de red

Arthur Cam
fuente
0

En caso de que otros tengan el mismo problema:

Tuve un error similar. resultó que estaba envolviendo varias sentencias SQL en una transacción, donde una de ellas se ejecutó en un servidor vinculado (sentencia Merge en una sentencia EXEC (...) AT Server). Resolví el problema abriendo una conexión separada al servidor vinculado, encapsulando esa declaración en un intento ... captura y luego aborto la transacción en la conexión original en caso de que se active la captura.

aggatón
fuente
0

Tuve el mismo mensaje de error. Para mí, cambiar pooling=Falsea ;pooling=true;Max Pool Size=200en la cadena de conexión solucionó el problema.

Niels Bijl
fuente
0

Tenía este problema con un servidor vinculado en SSMS mientras intentaba crear un procedimiento almacenado.

En el servidor vinculado, cambié la opción del servidor "Habilitar promoción en transacciones distribuidas" a Falso.

Captura de pantalla de las opciones del servidor

Zack Soderquist
fuente