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

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

    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

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

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

控制交易的默认方法是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;
本文链接:https://www.f2er.com/3168689.html

大家都在问