Chinaunix首页 | 论坛 | 博客
  • 博客访问: 580892
  • 博文数量: 80
  • 博客积分: 2393
  • 博客等级: 大尉
  • 技术积分: 1434
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-03 21:46
个人简介

己所不欲勿施于人!

文章分类

全部博文(80)

文章存档

2017年(1)

2016年(9)

2014年(1)

2013年(17)

2012年(5)

2011年(13)

2010年(9)

2009年(8)

2008年(17)

分类: Oracle

2008-04-03 20:24:26

 
多版本和并行控制紧密相关的主题,由于它构成了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命令把数据复制到一个成为回滚段的数据区域保存。
阅读(1995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~