多版本和并行控制紧密相关的主题,由于它构成了Oracle的并行控制机制的基础--oracle运行一个多版本一致读的并行模式。
oracle提供如下的机制:
1、一致读查询:在某一时刻查询产生一致结果。
2、非阻塞查询:数据写入器从来不阻塞查询,就像其他数据库一样。
在oracle数据库中有两个非常重要的概念。术语“多版本”基本上来自oracle在数据库中能够保持多个版本的数据这样一个事实。
如果理解了多版本是如何工作的,就能理解从数据库中得到的结果。
下面的代码演示了oracle多版本最简单的方法:
SQL> create tables t
2 as
3 select * from all_users;
create tables t
*
ERROR at line 1:
ORA-00901: invalid CREATE command
Elapsed: 00:00:00.01
SQL> ed
Wrote file afiedt.buf
1 create table t
2 as
3* select * from all_users
SQL> /
Table created.
Elapsed: 00:00:00.44
SQL> variable x refcursor
SQL> begin
2 open :x for select * from t;
3 end;
4 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01
SQL> delete from t;
31 rows deleted.
Elapsed: 00:00:00.08
SQL> commit;
Commit complete.
Elapsed: 00:00:00.02
SQL> print x
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
ORA_TEST 68 16-MAR-08
ORACLE 65 30-JAN-08
BI 63 05-JAN-08
SH 61 05-JAN-08
IX 60 05-JAN-08
OE 59 05-JAN-08
HR 58 05-JAN-08
SCOTT 57 10-AUG-04
MGMT_VIEW 56 10-AUG-04
PM 62 05-JAN-08
WKPROXY 51 10-AUG-04
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
WKSYS 50 10-AUG-04
MDDATA 49 10-AUG-04
SYSMAN 54 10-AUG-04
ANONYMOUS 43 10-AUG-04
XDB 42 10-AUG-04
WK_TEST 53 10-AUG-04
OLAPSYS 46 10-AUG-04
CTXSYS 40 10-AUG-04
MDSYS 36 10-AUG-04
SI_INFORMTN_SCHEMA 35 10-AUG-04
ORDPLUGINS 34 10-AUG-04
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
ORDSYS 33 10-AUG-04
EXFSYS 32 10-AUG-04
WMSYS 23 10-AUG-04
DBSNMP 22 10-AUG-04
DMSYS 37 10-AUG-04
DIP 19 10-AUG-04
OUTLN 11 10-AUG-04
SYSTEM 5 10-AUG-04
SYS 0 10-AUG-04
31 rows selected.
Elapsed: 00:00:00.00
在上例中,产生了一个测试表T,并且用ALL_USERS 表中的一些数据加载它。
在表T中打开了一个游标。注意:只是打开了游标,并没有从游标中提取数据。
当打开游标是,oracle 不响应查询,也不复制任何地方的数据。只有当从表中提取数据时,他才读取此数据。
在同一会话中,从表中删除所有数据。甚至只要一提交,就会删除这些数据。数据行消失了么?事实上,还可以通过游标检索这些数据,用OPEN命令返回的结果集,当打开表时,接触的已不是表中的单块数据,而是已经确定好的结果。
在提取数据之前,并不知道结果。然而从游标上看,结果是不会变的,打开游标时,oracle并不是把上面所有数据复制到其他地方;
实际上是delete命令把数据复制到一个成为回滚段的数据区域保存。
阅读(1990) | 评论(0) | 转发(0) |