写存储过程,因此,如果一个语句失败,则不会影响另一个语句?

问题描述 投票:0回答:1

我具有基本上插入数据的此过程。

    Begin Transaction
                Insert into [dbo].Values
                    (
                        EQ



                    )
                    values 
                    (
                        @EQ


                    )

                  End

            --Set @STATUSRet= 'Created'
            --Set @ErrorRet= ''

        Commit Transaction
    End Try
    Begin Catch

        Set @STATUSRet= 'Failed'
        Set @ErrorRet= (Select ERROR_MESSAGE())

        Rollback Transaction

    End Catch

现在,我想添加一段代码来调用另一个数据库服务器,并将数据插入到该服务器的表中,即远程插入。没关系,我会这样做,但是如果失败了,那将不影响我如上所述的当前数据插入过程,即,如果远程数据插入失败,则不应以任何方式影响先前的插入过程,并且应成功返回到调用应用程序的行为好像什么都没有发生。

sql sql-server tsql stored-procedures sql-server-2012
1个回答
1
投票

控制交易的默认方法是auto-commit

任何更改数据并自行执行的语句都是自动进行原子交易。变化是否影响一个行或数千行,它必须成功完成每一行致力于。您不能手动回滚自动提交交易。

因此,如果这两个插入未在显式事务中包装,这将是该行为。如果您有更多的代码块,则可以使用两个单独的显式事务块,如下所示:

DECLARE @ExecuteSecondTransaction BIT = 0;

-- local database
BEGIN TRY

    BEGIN TRANSACTION;

        -- CODE BLOCK GOES HERE

        SET @ExecuteSecondTransaction = 1;

    COMMIT TRANSACTION;

END TRY
BEGIN CATCH 

   IF @@TRANCOUNT > 0
   BEGIN
      ROLLBACK TRANSACTION
   END;

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

-- remote database
IF @ExecuteSecondTransaction = 1
BEGIN

    BEGIN TRY

        BEGIN TRANSACTION;
        -- CODE BLOCK GOES HERE
        COMMIT TRANSACTION;

    END TRY
    BEGIN CATCH 

       IF @@TRANCOUNT > 0
       BEGIN
          ROLLBACK TRANSACTION
       END;

       -- GET ERRORS DETAILS OR THROW ERROR

    END CATCH;

END;
© www.soinside.com 2019 - 2024. All rights reserved.