【问题标题】:How can I ensure that nested transactions are committed independently of each other?如何确保嵌套事务彼此独立提交?
【发布时间】:2011-06-04 15:16:52
【问题描述】:

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

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

我在 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

【问题讨论】:

    标签: sql-server tsql transactions commit


    【解决方案1】:

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

    但是,您可以按照此示例使用来自 SO 用户 Remus RusanuSAVEPOINTs(此处复制太长,抱歉)

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

    【讨论】:

      【解决方案2】:

      来自 BOL:

      回滚事务没有 保存点名称或事务名称 回滚到开头 交易。嵌套时 交易,同样的声明 将所有内部事务回滚到 最外层的 BEGIN TRANSACTION 声明。

      我还从另一个线程here 中找到了以下内容:

      注意 SQL Server 事务 并没有真正嵌套在你的方式中 可能会想。一次显式 交易开始,随后 BEGIN TRAN 递增 @@TRANCOUNT 而 COMMIT 会减少该值。 整个最外面的交易是 当 COMMIT 导致 零@@TRANCOUNT。但是回滚 没有保存点回滚所有 包括最外层的工作 交易。

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

      所以看起来是可能的。

      【讨论】:

      • "使用 ROLLBACK TRAN 代替 ROLLBACK TRAN" ??
      • @Greg - 感谢您指出这一点。我引用的文本在 savepoint_name 文本周围使用了尖括号,这导致 SO 标记引擎隐藏了文本。已编辑文本以使用方括号。
      猜你喜欢
      • 1970-01-01
      • 2016-01-19
      • 2015-10-02
      • 2021-10-09
      • 2016-06-28
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多