【问题标题】:Rolling back the whole procedure (all statements)回滚整个过程(所有语句)
【发布时间】:2010-08-07 13:25:08
【问题描述】:

如何编写过程,以便每当其中的任何语句出现错误时,我都可以回滚所有 INSERT、UPDATE 和 DELETE 语句。

请注意,我的程序可能有也可能没有按顺序列出的语句。换句话说,我有一个 INSERT 语句,然后是一些 IF 逻辑,然后是一个 select 语句,然后是另一个 INSERT,然后是一个 UPDATE,然后是逻辑,然后是 DELETE 语句,等等。

如果任何语句发生错误,我只想回滚所有 INSERT、UPDATE 和 DELETE 语句。我找到了这段代码http://msdn.microsoft.com/en-us/library/ms181299.aspxhttp://en.allexperts.com/q/MS-SQL-Server-1801/Rollback-SP.htm

但他们没有回答我的问题。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    如果事务使用XACT_ABORT 选项运行,这将自动发生。

    set xact_abort on
    begin tran
    
    /*Your code*/
    
    
    commit
    

    这里有相当多的 interesting question 讨论使用这种与结构化错误处理。

    【讨论】:

      【解决方案2】:

      查看 TRANSACTION 的工作原理(您提供的链接也使用它,但由于 DTS 交互,事务似乎存在错误)。基本上,您可以回滚自您发出信号开始交易以来所做的所有事情。

      马丁·史密斯的answer with xact_abort is desribed in more detail here

      【讨论】:

        【解决方案3】:

        您所描述的称为“数据库事务处理”。在将数据写入数据库方面,它创建了一个“全有或全无”的结构。

        它创建了一个逻辑框架,您的所有表都在其中一起更新,但如果一个表无法更新,则整个事务将回滚到以前的状态。

        大多数数据库都是这样做的。伪代码如下。

        开始交易 更新表一 更新表二 [更新大量表格] 如果所有更新成功 提交(对所有表的所有更改) 别的 回滚(所有更改) 结束交易

        请注意,术语“事务”、“提交”和“回滚”通常也是大多数数据库使用的技术术语。

        可能比我解释得更好的链接。 http://www.subbu.org/articles/nuts-and-bolts-of-transaction-processing

        查看您的数据库文档,您应该会找到所有这些的参考。

        HTH,如果没有评论,我会再试一次。 :-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-05
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          相关资源
          最近更新 更多