【发布时间】:2012-03-28 03:59:03
【问题描述】:
我需要找出受回滚影响的行数。 我怎样才能得到这个?请帮忙。
【问题讨论】:
-
需要更多信息:“受影响”是什么意思(参见 paxdiablo 的回答),为什么需要这个?
我需要找出受回滚影响的行数。 我怎样才能得到这个?请帮忙。
【问题讨论】:
考虑一个有两列(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
【讨论】:
实际上,受回滚影响的行数是零。这是因为,从技术上讲,这些行在提交发生之前不会更改(ACID 中的A)。而且,如果您回滚,则不会发生提交。
【讨论】:
我不知道用 oracle 执行此操作的方法,但您可以使用 SQL%ROWCOUNT 跟踪您创建/更改/删除的行,这样您就知道在回滚时会受到什么影响
【讨论】:
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;
【讨论】: