0

ある 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

私はこれを見ました: 関連するトラックですが、私はループバック リンク サーバーを持っていないと思います

StoredProcedure は、トランザクション ブロックがなくても正常に機能します

どんな助けでも大歓迎です。

4

1 に答える 1