【问题标题】:number of rows affected by rollback受回滚影响的行数
【发布时间】:2012-03-28 03:59:03
【问题描述】:

我需要找出受回滚影响的行数。 我怎样才能得到这个?请帮忙。

【问题讨论】:

  • 需要更多信息:“受影响”是什么意思(参见 paxdiablo 的回答),为什么需要这个?

标签: oracle plsql


【解决方案1】:

考虑一个有两列(id、value)和两行的表 fred。 第一行是(1,'Blue'),第二行是(2,'Blue')

我发表以下声明

INSERT INTO fred VALUES (1,'Red'); [inserts 1 row]
UPDATE fred SET value = 'Blue';    [updates 3 rows but the value on 2 doesn't change]
UPDATE fred SET id = 3 WHERE id = 1; [updates 1 row]
ROLLBACK;

表中最初的两条记录都已更新。 1 更新了两次。插入一行,然后更新。然后所有这些更改都被回滚。问题是,你想要什么号码?更新的记录数,或对记录执行的更新总数。

从技术角度来看,最简单的答案是统计数据number of undo records applied。但是你必须在之前和之后测量这个。实际上,它可能会变得非常混乱,因为对于命中并发活动的 UPDATE 语句,语句可能会在中途停止、回滚并重新启动。参考AskTom

【讨论】:

  • +1,请注意,在递归 sql 回滚(例如删除级联)的情况下,撤消记录可能会产生误导。
【解决方案2】:

实际上,受回滚影响的行数是。这是因为,从技术上讲,这些行在提交发生之前不会更改(ACID 中的A)。而且,如果您回滚,则不会发生提交。

【讨论】:

  • 就是这样。我想知道回滚了多少行。
  • @payal 他说,由于这些行/更改在技术上不存在,直到您提交它们,您可能必须自己跟踪它们。
  • @payal,我认为 Oracle 不提供此信息。回滚(包括到保存点)不会更改 ROWCOUNT,因此即使尝试手动执行此操作也会有问题。如果你能告诉我们为什么你需要这个,也许会有更好的方法。
【解决方案3】:

我不知道用 oracle 执行此操作的方法,但您可以使用 SQL%ROWCOUNT 跟踪您创建/更改/删除的行,这样您就知道在回滚时会受到什么影响

【讨论】:

    【解决方案4】:
    declare
      i number:=0;
    begin
      INSERT INTO fred VALUES (1,'Red'); [inserts 1 row]
      i := i + sql%rowcount;
      UPDATE fred SET value = 'Blue';    [updates 3 rows but the value on 2 doesn't change]
      i := i + sql%rowcount;  
      UPDATE fred SET id = 3 WHERE id = 1; [updates 1 row]
      i := i + sql%rowcount;
      if <condition> then
          COMMIT;
          dbms_output.PUT_LINE(i || ' rows COMMITED';
          i := 0;
      else
          ROLLBACK;
          dbms_output.PUT_LINE(i || ' rows ROLLBACK';
          i := 0;
      end if;
    end;
    

    【讨论】:

    • 欢迎您,在这里,解释为什么要使用您的解决方案而不只是如何使用是一个很好的做法。这将使您的答案更有价值,并帮助进一步的读者更好地理解您是如何做到的。我还建议您查看我们的常见问题解答:stackoverflow.com/faq
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多