oracle redo与undo_笔记4:ROLLBACK做什么
ROLLBACK做什么
把COMMIT改为ROLLBACK,可能会得到完全不同的结果。回滚时间绝对是所修改数据量的一个函数。修改上一节中的脚本,要求完成一个ROLLBACK(只需把COMMIT改成ROLLBACK),计时信息将完全不同,参见下面的结果。
sys@ORCL>start 20131122_qc_script.sql - Rows Redo CPU Elapsed - 10 1,516 0 1 -100 10,656 0 1 - 1,000114,900 1 0 - 10,000 1,175,768 2 2 - 100,000 9,436,964 14 14 - 1,000,000 9,261,672 12 13 PL/SQL procedure successfully completed.
CPU占用时间与运行时间的差别是可以预见的,因为ROLLBACK必须物理地撤销我们所做的工作。类似于COMMIT,必须完成一系列操作。在到达ROLLBACK之前,数据库已经做了大量的工作。
.已经在SGA中生成了undo段记录
.已经在SGA中生成了已修改数据块
.已经在SGA中生成了对应前两项的缓存redo日志
.取决于前三项的大小,以及这些工作所花费的时间,前面的某个数据(或某些数据)可能已经刷新输出到磁盘
.已经得到了所需的全部锁
ROLLBACK时,要做以下工作
.撤销已做的所有修改。其完成方式如下:从undo段读回数据,然后实际上逆向执行前面所做的操作,并将undo条目标记为已用。如果先前插入了一行,ROLLBACK会将其删除。如果更新了一行,回滚就会取消更新。如果删除了一行,回滚将把它再次插入。
.会话持有的所有锁都将释放,如果有人在排队等待我们持有的锁,就会被唤醒。
20131122_qc_script.sql
declare
l_redo number;
l_cpu number;
l_ela number;
begin
dbms_output.put_line
('-' || ' Rows' || ' Redo' ||
' CPU' || ' Elapsed');
for i in 1..6
loop
l_redo :=get_stat_val('redo size');
insert into t select * from big_table where rownum <=power(10,i);
l_cpu :=dbms_utility.get_cpu_time;
l_ela :=dbms_utility.get_time;
--commit work write wait;
rollback;
dbms_output.put_line
('-' ||
to_char( power(10,i),'9,999,999') ||
to_char((get_stat_val('redo size')-l_redo),'999,999,999') ||
to_char((dbms_utility.get_cpu_time-l_cpu),'999,999') ||
to_char((dbms_utility.get_time-l_ela),'999,999'));
end loop;
end;
/
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5257.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
