与SQL Server链接服务器一起使用事务 - 另一个会话正在使用的事务上下文

时间:2013-10-14 04:34:25

标签: sql-server tsql

在一个StoredProcedure中,我使用链接服务器在另一个DB中进行一些插入/更新。已将代码包装在事务中。

CREATE PROCEDURE [mySchema].[mySP] (paramList)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT OFF;
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

    DECLARE @TranStarted AS BIT = 0;

    BEGIN TRY
            IF @@TRANCOUNT = 0
            BEGIN
              BEGIN TRANSACTION;
              SET @TranStarted = 1;
            END 

   -- Do some stuff with linked server (inserts and updates on another server)

   IF @TranStarted = 1
      BEGIN
        COMMIT TRANSACTION;
      END
    END TRY

    BEGIN CATCH
        IF @TranStarted = 1
        BEGIN
            ROLLBACK TRANSACTION;
        END

        PRINT 'ERROR_NUMBER: ' + CAST(ERROR_NUMBER() AS NVARCHAR(10));
        PRINT 'ERROR_MESSAGE: ' + ERROR_MESSAGE();
        PRINT 'ERROR_SEVERITY: ' + CAST(ERROR_SEVERITY() AS NVARCHAR(2));
        PRINT 'ERROR_STATE: ' + CAST(ERROR_STATE() AS NVARCHAR(3));
        PRINT 'ERROR_PROCEDURE: ' + ERROR_PROCEDURE();
        PRINT 'ERROR_LINE: ' + CAST(ERROR_LINE() AS NVARCHAR(5));
    END CATCH           
END

结果如下:

ERROR_NUMBER: 3910
ERROR_MESSAGE: Transaction context in use by another session.
ERROR_SEVERITY: 16
ERROR_STATE: 2

ERROR_LINE: 1

我见过这个: Related track但我认为我没有任何环回链接服务器

StoredProcedure在没有事务阻止的情况下正常工作

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这可能不适合您的情况,但万一它确实适合您或其他人......

我在使用引用同一SQL服务器上的链接服务器并且包含";MultipleActiveResultSets=true"的连接字符串的触发器更新表时遇到“事务上下文正在使用...”错误。我正在为需要的功能添加脚本的应用程序。

但是,如果我使用不带MultipleActiveResultSets的连接字符串,则应用程序能够成功更新表。在我们的PROD环境中,链接服务器连接到不同的服务器,但在我们的DEV环境中,它链接回同一服务器。将MultipleActiveResultSets设置为true时,SQL Server将尝试创建分布式事务并失败,因为它是一个环回(很多帖子已指示DTC不支持)。

将MultipleActiveResultSets设置为false(或从连接字符串中删除),SQL Server没有环回问题。