Contexto de transacción en uso por otra sesión

Tengo una mesa llamada MyTable en el que he definido un disparador, así:

CREATE TRIGGER dbo.trg_Ins_MyTable
   ON  dbo.MyTable 
   FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert SomeLinkedSrv.Catalog.dbo.OtherTable 
        (MyTableId, IsProcessing, ModifiedOn)
    values (-1, 0, GETUTCDATE())
END
GO

Cada vez que intento insertar una fila en MyTable, Recibo este mensaje de error:

Mensaje 3910, Nivel 16, Estado 2, Línea 1 Contexto de transacción en uso por otra sesión.

He SomeLinkedSrv correctamente definido como un servidor vinculado (por ejemplo, select * from SomeLinkedSrv.Catalog.dbo.OtherTable funciona bien).

¿Cómo puedo evitar el error e insertar con éxito grabar + ejecutar el disparador?

preguntado el 22 de mayo de 12 a las 15:05

¿También hay un disparador en SomeLinkedSrv.Catalog.Dbo.OtherTable? -

@Gratzy - no, OtherTable no tiene disparadores definidos -

¿Está sucediendo en una transacción explícita? ¿Está activado el DTC en ambos servidores? -

¿Has intentado implementar esto como un disparador en lugar de? ¿Qué tipo de transacción está utilizando para el inserto original? ¿Ha considerado registrar esto localmente y usar un proceso en segundo plano para actualizar el servidor remoto (de esta manera, el servidor remoto no complica la transacción principal y la transacción principal no tiene que esperar a la operación remota)? -

@Gratzy por el momento estoy probando esto en mi máquina de desarrollo; Estoy conectado a la instancia local de SQLSserver y el servidor vinculado apunta a esa misma instancia. MSDTC se está ejecutando. -

8 Respuestas

Los servidores vinculados de bucle invertido no se pueden usar en una transacción distribuida si MARS está habilitado.

Los servidores vinculados de bucle invertido no se pueden utilizar en una transacción distribuida. Probar una consulta distribuida en un servidor vinculado de bucle invertido desde dentro de una transacción distribuida provoca un error, como el error 3910: "[Microsoft] [Controlador ODBC de SQL Server] [SQL Server] Contexto de transacción en uso por otra sesión". Esta restricción no se aplica cuando una instrucción INSERT...EXECUTE, emitida por una conexión que no tiene varios conjuntos de resultados activos (MARS) habilitados, se ejecuta en un servidor vinculado de bucle invertido. Tenga en cuenta que la restricción aún se aplica cuando MARS está habilitado en una conexión.

http://msdn.microsoft.com/en-us/library/ms188716(SQL.105).aspx

contestado el 22 de mayo de 12 a las 16:05

Lo soluciono. Estaba usando el mismo servidor vinculado para llamar al segundo procedimiento y luego en el procedimiento estaba usando el mismo servidor vinculado.

Es muy Fácil, solo tenemos que conocer las restricciones de los servidores enlazados.

respondido 20 nov., 15:17

Lo resolví eliminando el servidor vinculado utilizado en el procedimiento almacenado y luego llamé al procedimiento almacenado por el mismo servidor vinculado. No estaba funcionando en el entorno DEV.

respondido 15 nov., 16:19

Una de las causas de esta situación es un disparador que funciona para la tabla de la base de datos del servidor vinculado. Una versión también SQL de SQL-Server que procesa asuntos de bases de datos. Para evitar este ERROR durante la ejecución de la consulta sql, debemos deshabilitar temporalmente y después de la ejecución habilitar los disparadores para las tablas actualizadas. Todo con verificación de nombre de base de datos. Aquí hay un ejemplo:

     Select * From People  where PersonId In (@PersonId, @PersonIdRight)
     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] DISABLE TRIGGER [PeopleSites_ENTDB_UPDATE]

     Update PeopleSites Set PersonId = @PersonIdRight Where  PersonId = @PersonId

     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] ENABLE TRIGGER [PeopleSites_ENTDB_UPDATE]


     Select * From PeopleSites where PersonId In (@PersonId, @PersonIdRight)

contestado el 19 de mayo de 20 a las 13:05

También recibí el mismo error en nuestro entorno DEV, mover las bases de datos vinculadas a otra instancia de sql resolvió el problema. En nuestro entorno de producción, estas bases de datos ya están en instancias separadas.

Respondido 29 Oct 14, 11:10

En mi caso, estaba usando SQL 2005 y obtuve "contexto de transacción en uso por otra sesión" cuando ejecuté Insertar .... exec sobre un servidor vinculado. La solución para mí fue parchear desde SP2 compilación 3161 a SP3. Sin embargo, se supone que SP2 acumulativo 5 debe corregirse.

https://support.microsoft.com/en-us/kb/947486

Respondido 12 Feb 16, 16:02

Cuando la base de datos remota se encuentra en el mismo servidor, configure el servidor vinculado sin especificar la IP/nombre de host y puerto del servidor de la base de datos. Solo el nombre de la base de datos debería ser suficiente.

Respondido el 05 de Septiembre de 16 a las 11:09

Obtuve el mismo "contexto de transacción en uso por otro error de sesión" al intentar ejecutar una consulta de ACTUALIZACIÓN:

 BEGIN      TRAN
--ROLLBACK  TRAN
--COMMIT    TRAN
UPDATE  did 
SET     did.IsProcessed = 0,
        did.ProcessingLockID = NULL
FROM    [proddb\production].DLP.dbo.tbl_DLPID did (NOLOCK)
WHERE   did.dlpid IN ('bunch of GUIDs')
--WHERE   did.DLPID IN (SELECT DLPID FROM @TableWithData)

Sin embargo, no me di cuenta de que ya estaba intentando ejecutar esto en la base de datos DLP en el servidor ProdDb\Production. Una vez eliminé ese "[proddb\production].DLP.dbo". prefijo de la consulta, funcionó bien.

Respondido 17 Jul 19, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.