如何确保嵌套事务彼此独立地提交?

时间:2011-01-06 12:35:21

标签: sql-server tsql transactions commit

如果我有一个使用不同参数多次执行另一个存储过程的存储过程,是否可以让每个调用独立于其他调用进行提交?

换句话说,如果嵌套过程的前两次执行成功,但第三次执行失败,是否可以保留前两次执行的结果(而不是回滚)?

我在SQL Server 2000中定义了类似的存储过程:

CREATE PROCEDURE toplevel_proc ..
AS
BEGIN

         ...

         while @row_count <= @max_rows
    begin
        select @parameter ... where rownum = @row_count 
        exec nested_proc @parameter
        select @row_count = @row_count + 1
    end

END

2 个答案:

答案 0 :(得分:8)

首先,there is no such thing as a nested transaction in SQL Server

但是,您可以根据此示例使用SAVEPOINTs(此处很长时间,以便在此处重现)来自SO用户Remus Rusanu

编辑:AlexKuznetsov提到(他删除了他的答案),如果交易注定失败,这将无效。 SET XACT_ABORT ON或某些触发错误可能会发生这种情况。

答案 1 :(得分:4)

来自BOL:

  

没有a的ROLLBACK TRANSACTION   savepoint_name或transaction_name   滚回到开头   交易。嵌套时   交易,同样的声明   将所有内部事务回滚到   最外面的BEGIN TRANSACTION   言。

我还从另一个帖子here找到了以下内容:

  

请注意SQL Server事务   并没有真正嵌套你的方式   可能会想。一旦明白了   交易开始,随后   BEGIN TRAN增加@@ TRANCOUNT   而COMMIT递减值。   整个最重要的交易是   当COMMIT导致a时提交   零@@ TRANCOUNT。但是ROLLBACK   没有保存点回滚所有   包括最外层的工作   交易。

     

如果您需要嵌套事务   行为,你需要使用SAVE   TRANSACTION而不是BEGIN TRAN和   使用ROLLBACK TRAN [savepoint_name]   而不是ROLLBACK TRAN。

所以看起来可能。