oracle数据库:开发成功的Oracle应用_笔记8
1.3.3多版本控制
这个主题与并发控制的关系非常紧密,因为这正是Oracle并发控制机制的基础。Oracle采用了一种多版本、读一致(read-consistent)的并发模型。Oracle利用这种机制提供了以下特性。
.读一致查询:对于一个时间点,查询会产生一致的结果。
.非阻塞查询:查询不会被写入器阻塞,但在其他数据库中可能不是这样。
多版本(multi-versioning)一词实质上指Oracle能够从数据库同时物化多个版本的数据。“读一致性”反映了一个事实:Oracle中的查询会从某个一致的时间点开始返回,查询使用的每个块都从同一个时间点开始,即使它在你执行查询时被修改或锁定。
注意:打开游标时,Oracle并不复制任何数据,可以想想看,即使一个表有十亿条记录,是不是也能很快就打开游标?没错,游标会立即打开,它会边行进边回答查询。换句话说,只是在你获取数据时它才从表中读数据。
打开游标时,并非Oracle将上面所有数据复制到另外某个位置。实际上是DELETE命令为我们把数据保留下来,把它放在一个称为undo段(undo segment)的数据区,这个数据区也称为回滚段(rollback segment)。
1、闪回
过去,Oracle总是基于查询的某个时间点来做决定(从这个时间点开始查询是一致的)。也就是说,Oracle会保证打开的结果集肯定是以下两个时间点之一的当前结果集。
.游标打开时的时间点。这是READ COMMITTED隔离模式的默认行为,该模式是默认的事务模式。
.查询所属事务开始的时间点。这是READ ONLY和SERIALIZABLE隔离级别中的默认行为。
从OracleDatabase9i的闪回查询特性开始,我们可以指示Oracle提供任何指定时间的查询结果(对于回放的时间长度有一些合理的限制)。利用闪回查询的特性,可以更直接地看到“读一致性”和多版本控制。
注意:闪回数据归档用于长期闪回查询(过去的数月甚至数年),这是Oracle Database 11g Release 1及以上版本增加的特性,它没有使用“读一致性”和“多版本控制”来生成之前某个时间点数据库中数据的版本,而是使用了置于归档中的记录的“前映像”副本。
SCN是Oracle的内部时钟,每次发生提交时,这个时钟就会向上递增。
例子测试
scott@ORCL>variable scn number
scott@ORCL>exec :scn :=dbms_flashback.get_system_change_number;
BEGIN :scn :=dbms_flashback.get_system_change_number; END;
*
ERROR at line 1:
ORA-06550: line 1, column 14:
PLS-00201: identifier 'DBMS_FLASHBACK' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
sys@ORCL>grant execute on dbms_flashback to scott;
Grant succeeded.
scott@ORCL>exec :scn :=dbms_flashback.get_system_change_number;
PL/SQL procedure successfully completed.
scott@ORCL>print scn
SCN
----------
4763928
scott@ORCL>select count(*) from emp;
COUNT(*)
----------
14
scott@ORCL>delete from emp;
14 rows deleted.
scott@ORCL>select count(*) from emp;
COUNT(*)
----------
0
scott@ORCL>select count(*),
2 :scn then_scn,
3 dbms_flashback.get_system_change_number now_scn
4 from emp as of scn :scn;
COUNT(*) THEN_SCN NOW_SCN
---------- ---------- ----------
14 4763928 4763981
Commit complete.
scott@ORCL>select cnt_now,cnt_then,
2 :scn then_scn,
3 dbms_flashback.get_system_change_number now_scn
4 from (select count(*) cnt_now from emp),
5 (select count(*) cnt_then from emp as of scn :scn)
6 /
CNT_NOW CNT_THEN THEN_SCN NOW_SCN
---------- ---------- ---------- ----------
0 14 4763928 4764106
scott@ORCL>flashback table emp to scn :scn;
flashback table emp to scn :scn
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
scott@ORCL>select * from emp;
no rows selected
scott@ORCL>select row_movement from user_tables where table_name='emp';
no rows selected
no rows selected
scott@ORCL>select * from user_tables where table_name='emp';
no rows selected
scott@ORCL>alter table emp enable row movement;
Table altered.
scott@ORCL>flashback table emp to scn :scn;
Flashback complete.
scott@ORCL>select cnt_now,cnt_then,
2 :scn then_scn,
3 dbms_flashback.get_system_change_number now_scn
4 from (select count(*) cnt_now from emp),
5 (select count(*) cnt_then from emp as of scn :scn)
6 /
CNT_NOW CNT_THEN THEN_SCN NOW_SCN
---------- ---------- ---------- ----------
14 14 4763928 4764362
scott@ORCL>
http://blog.csdn.net/guhui2509/article/details/6192245
闪回命令出错 ORA-08189: cannot flashback the table because row movement is not enabled
http://blog.csdn.net/yy_mm_dd/article/details/2992183
oracle 使用DBMS_FLASHBACK恢复意外删除的数据
http://www.52ij.com/jishu/5136.html
oracle数据库:开发成功的Oracle应用_笔记7
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5137.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
