回滚整个过程(所有陈述)

时间:2010-08-07 13:25:09

标签: sql-server

如何以某种方式编写该过程,以便在其中的任何语句出错时我可以ROLLBACK所有INSERT,UPDATE和DELETE语句。

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

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

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

3 个答案:

答案 0 :(得分:4)

如果交易使用XACT_ABORT选项运行,则会自动执行此操作。

set xact_abort on
begin tran

/*Your code*/


commit

这是一个使用此结构化错误处理的interesting question讨论。

答案 1 :(得分:2)

查看TRANSACTION如何工作(您提供的链接也使用它,但由于DTS交互,交易似乎有问题)。基本上,您可以回滚自从您发出启动交易信号后所做的一切。

Martin Smith的answer with xact_abort is desribed in more detail here

答案 2 :(得分:2)

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

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

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

Begin transaction
    Update Table One
    Update table Two
    [Update lots of tables]
    if all updates successfull
        commit (All changes to all tables)
    else
        rollback (All changes)
End transaction

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

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

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

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