【问题标题】:Rollback transaction multiple query回滚事务多重查询
【发布时间】:2014-04-15 10:34:50
【问题描述】:

我有一个如下的存储过程:

DECLARE @FinalQuery varchar(max), @TableName varchar(200)
DECLARE ListTable CURSOR FOR SELECT....
DECLARE @isError bit=0
OPEN ListTable 
FETCH NEXT FROM ListTable INTO @TableName
WHILE @@FETCH_STATUS=0
BEGIN
    //Some code to generate @FinalQuery to merge data into table @TableName
    BEGIN TRY
        EXEC(@FinalQuery)
    END TRY
    BEGIN CATCH
        Set @IsError = 1
        //Some code to write error to log file.
    END CATCH
    FETCH NEXT FROM ListTable INTO @TableName
END
CLOSE ListTable 
DEALLOCATE ListTable 

现在,我想将事务和回滚添加到我的存储过程。我希望执行所有动态@FinalQuery 查询,最后,当它完成时,如果存在任何错误(@IsError=1)然后回滚所有内容。我该怎么做?

【问题讨论】:

    标签: sql sql-server transactions rollback


    【解决方案1】:
     BEGIN TRAN
     BEGIN TRY
       EXEC(@FinalQuery)
    END TRY
    BEGIN CATCH
        Set @IsError = 1
        //Some code to write error to log file.
    ROLLBACK
    END CATCH
    COMMIT
    

    【讨论】:

    • 我收到此错误:Microsoft 分布式事务协调器 (MS DTC) 已取消分布式事务。
    • 不同错误:当前事务无法提交,无法支持写入日志文件的操作。回滚事务。
    • 最后一次尝试,如果没有,我不知道如何提供帮助:)
    • Microsoft 分布式事务协调器 (MS DTC) 已再次取消分布式事务。还是谢谢你:)
    • sqlservercentral.com/Forums/Topic1170215-146-1.aspx检查此链接也许会有所帮助
    【解决方案2】:

    由于您希望在发生错误时回滚所有更改,您是否尝试过将事务移出循环?

    OPEN ListTable 
    FETCH NEXT FROM ListTable INTO @TableName
    BEGIN TRY
        WHILE @@FETCH_STATUS=0
        BEGIN
            //Some code to generate @FinalQuery to merge data into table @TableName
            EXEC(@FinalQuery)
            FETCH NEXT FROM ListTable INTO @TableName
        END
        COMMIT
    END TRY
    BEGIN CATCH
        Set @IsError = 1
        //Some code to write error to log file.
        ROLLBACK
    END CATCH
    CLOSE ListTable 
    DEALLOCATE ListTable 
    

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 2012-07-15
      • 2016-09-19
      • 1970-01-01
      • 2018-11-08
      • 2015-06-25
      • 2014-12-11
      • 1970-01-01
      • 2016-02-07
      相关资源
      最近更新 更多