0

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

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

我看过这个: 相关曲目,但我认为我没有任何环回链接服务器

没有事务块的 StoredProcedure 工作正常

任何帮助将不胜感激。

4

1 回答 1

1

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

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

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

将 MultipleActiveResultSets 设置为 false(或在连接字符串之外),SQL Server 不会有环回问题。

于 2016-12-12T22:17:09.470 回答