try transaction transacciones tipos gestion ejemplos distribuidas comandos catch anidadas sql-server sql-server-2005 msdtc distributed-transactions

sql-server - transaction - transacciones sql server ejemplos



No se puede comenzar una transacción distribuida (6)

Estoy tratando de ejecutar SQL contra un servidor vinculado, pero obtengo los errores.

BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.". Msg 7391, Level 16, State 2, Line 3 The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

El proveedor ha devuelto dos errores:

Error n. ° 1:

Number: $80040E14 Source: Microsoft OLE DB Provider for SQL Server Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.". HelpFile: HelpContext: $00000000 SQLState: 01000 NativeError: 7412

Error # 2

Number: $80040E14 Source: Microsoft OLE DB Provider for SQL Server Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction. HelpFile: HelpContext: $00000000 SQLState: 42000 NativeError: 7391

¿Cómo hago para que Microsoft favorezca la funcionalidad por sobre la seguridad?

O, al menos, ¿cómo puedo obtener dos SQL Severs para hablar entre ellos?

Preguntas relacionadas

Lo que he hecho es irrelevante, pero lo publicaré de todos modos.

  1. Asegúrese de que el servicio Distributed Transaction Coordinator se ejecuta en ambas máquinas:

  2. Deshabilite toda la seguridad de MSDTC en ambas máquinas:

  3. Active las opciones aleatorias en el servidor vinculado:

  1. Maldijo y maldijo.

  2. Cosas rotas.

  3. Comprueba que un SELECT puede usar el servidor vinculado :

    SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)

  4. Comprobó que el servidor del cliente puede hacer ping al servidor remoto :

    C:/Documents and Settings/avatar>ping asicmstest.contoso.com Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data: Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.40: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms

  5. Comprobó que el servidor remoto puede comunicar, por nombre, al servidor de inicio:

    C:/Documents and Settings/avatar>ping asitestserver.contoso.com Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data: Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.22: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms

  6. Comprueba que @@SERVERNAME coincida con el nombre del servidor en ambos servidores :

    SELECT @@SERVERNAME, SERVERPROPERTY(''MachineName'') ------------- ------------- ASITESTSERVER ASITESTSERVER

    y

    SELECT @@SERVERNAME, SERVERPROPERTY(''MachineName'') ---------- ---------- ASIGROBTEST ASIGROBTEST

  7. Gritó

  8. Emitido SET XACT_ABORT ON antes de emitir mi consulta :

    SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions

  9. Concedido Full Control Everyone para :

    HKEY_LOCAL_MACHINE/Software/Microsoft/MSSQLServer

    en ambos servidores.


Además de la configuración de seguridad, tuve que abrir algunos puertos en ambos servidores para que se ejecutara la transacción. Tuve que abrir el puerto 59640 pero de acuerdo con la siguiente sugerencia, el puerto 135 debe estar abierto. http://support.microsoft.com/kb/839279


De acuerdo, los servicios se inician, hay una ruta de Ethernet entre ellos, la resolución de nombres funciona, los servidores vinculados funcionan y se deshabilita la autenticación de transacciones.

Mi instinto me dice que es un problema de firewall, pero me vienen a la mente algunas cosas ...

  1. ¿Las máquinas están en el mismo dominio? (Sí, no debería importar con la autenticación deshabilitada)
  2. ¿Se están ejecutando firewalls en las máquinas? DTC puede ser un poco molesto para los firewalls, ya que utiliza un rango de puertos, consulte http://support.microsoft.com/kb/306843 Por el momento, inhabilitaría los firewalls para identificar el problema.
  3. ¿Qué dice DTC ping? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. ¿En qué cuenta se está ejecutando el servicio SQL?

Encontrado, MSDTC en el servidor remoto era un clon del servidor local.

Desde el registro de eventos de la aplicación de Windows:

Tipo de evento: error
Origen del evento: MSDTC
Categoría de evento: CM
Identificador de evento: 4101
Fecha: 19/9/2011
Hora: 1:32:59 PM
Usuario: N / A
Computadora: ASITESTSERVER
Descripción:

El MS DTC local detectó que el MS DTC en ASICMSTEST tiene la misma identidad única que el MS DTC local. Esto significa que los dos MS DTC no podrán comunicarse entre sí. Este problema normalmente ocurre si uno de los sistemas se clonó usando herramientas de clonación no compatibles. MS DTC requiere que los sistemas se clonen utilizando herramientas de clonación compatibles como SYSPREP. Al ejecutar ''msdtc -uninstall'' y luego ''msdtc -install'' desde el símbolo del sistema se solucionará el problema. Nota: Al ejecutar ''msdtc -uninstall'', el sistema perderá toda la información de configuración de MS DTC.

Para obtener más información, vea el Centro de ayuda y soporte en http://go.microsoft.com/fwlink/events.asp .

Corriendo

msdtc -uninstall msdtc -install

y luego detener y reiniciar el servicio de SQL Server lo solucionó.


Mi última aventura con MSDTC y este error hoy resultó ser un problema de DNS. Está en el camino correcto preguntando si las máquinas están en el mismo dominio, EBarr. Excelente lista para este tema, por cierto!

Mi situación: necesitaba un servidor en un dominio secundario para poder ejecutar transacciones distribuidas contra un servidor en el dominio principal a través de un firewall. He utilizado servidores vinculados bastante a lo largo de los años, así que tenía todos los ajustes habituales en SQL para un servidor vinculado y en MSDTC que Ian documentó tan bien arriba. Configuré MSDTC con una gama de puertos TCP (5000-5200) para utilizar en ambos servidores, y organizó un agujero de cortafuegos entre las cajas para los puertos 1433 y 5000-5200. Eso debería haber funcionado. El servidor vinculado probó OK y pude consultar muy bien el servidor SQL remoto a través del servidor vinculado, pero no pude conseguir que permitiera una transacción distribuida. Incluso pude ver una conexión en el servidor QA desde el servidor DEV, pero algo no estaba haciendo el viaje de regreso.

Podría PING el servidor DEV de QA usando un FQDN como: PING DEVSQL.dev.domain.com

No pude PING el servidor DEV con solo el nombre de la máquina: PING DEVSQL

Se suponía que el servidor DEVSQL era un miembro de ambos dominios, pero el nombre no se estaba resolviendo en el DNS del dominio principal ... algo le había sucedido a la cuenta de la máquina para DEVSQL en el dominio principal. Una vez que agregamos DEVSQL al DNS para el dominio principal, y "PING DEVSQL" funcionó desde el servidor QA remoto, este problema se resolvió para nosotros.

¡Espero que esto ayude!


Si los servidores están agrupados y hay un DTC agrupado, debe desactivar la seguridad en el DTC agrupado, no en el DTC local.


Si su servidor de Destino está en otra nube o centro de datos, entonces necesita agregar la entrada de host del servicio MSDTC (Servidor de Destino) en su servidor de origen.

Pruebe esto si el problema no se resuelve, después de habilitar la configuración de MSDTC.