Oracle中多版本控制的例子(MVCC)

mvcc(multi-version concurrency control)多版本控制技术在数据库中可以显著的提高并发性能。

1 我们先看看表格里有什么
SQL> select * from all_users;

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
BI 60 04-1月 -09
PM 59 04-1月 -09
SH 58 04-1月 -09
IX 57 04-1月 -09
OE 56 04-1月 -09
HR 55 04-1月 -09
SCOTT 54 30-8月 -05
MGMT_VIEW 53 30-8月 -05
MDDATA 50 30-8月 -05
SYSMAN 51 30-8月 -05
MDSYS 46 30-8月 -05

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
SI_INFORMTN_SCHEMA 45 30-8月 -05
ORDPLUGINS 44 30-8月 -05
ORDSYS 43 30-8月 -05
OLAPSYS 47 30-8月 -05
ANONYMOUS 39 30-8月 -05
XDB 38 30-8月 -05
CTXSYS 36 30-8月 -05
EXFSYS 34 30-8月 -05
WMSYS 25 30-8月 -05
DBSNMP 24 30-8月 -05
TSMSYS 21 30-8月 -05

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
DMSYS 35 30-8月 -05
DIP 19 30-8月 -05
OUTLN 11 30-8月 -05
SYSTEM 5 30-8月 -05
SYS 0 30-8月 -05

已选择27行。

已用时间: 00: 00: 00.03

2 创建一个测试表格
SQL> create table t as select * from all_users;

表已创建。

已用时间: 00: 00: 00.18

3 声明游标
SQL> variable x refcursor
SQL> begin
  2 open :x for select * from t;
  3 end;
  4 /

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.01

4 删除表格的数据
SQL> delete from t;

已删除27行。

已用时间: 00: 00: 00.00

5 提交事务
SQL> commit;

提交完成。

已用时间: 00: 00: 00.00

6 看看游标的数据
SQL> print x

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
BI 60 04-1月 -09
PM 59 04-1月 -09
SH 58 04-1月 -09
IX 57 04-1月 -09
OE 56 04-1月 -09
HR 55 04-1月 -09
SCOTT 54 30-8月 -05
MGMT_VIEW 53 30-8月 -05
MDDATA 50 30-8月 -05
SYSMAN 51 30-8月 -05
MDSYS 46 30-8月 -05

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
SI_INFORMTN_SCHEMA 45 30-8月 -05
ORDPLUGINS 44 30-8月 -05
ORDSYS 43 30-8月 -05
OLAPSYS 47 30-8月 -05
ANONYMOUS 39 30-8月 -05
XDB 38 30-8月 -05
CTXSYS 36 30-8月 -05
EXFSYS 34 30-8月 -05
WMSYS 25 30-8月 -05
DBSNMP 24 30-8月 -05
TSMSYS 21 30-8月 -05

USERNAME USER_ID CREATED
------------------------------ ---------- --------------
DMSYS 35 30-8月 -05
DIP 19 30-8月 -05
OUTLN 11 30-8月 -05
SYSTEM 5 30-8月 -05
SYS 0 30-8月 -05

已选择27行。

已用时间: 00: 00: 00.01
SQL>

欢迎光临老紫竹的 个人网站 和我在 CSDN的博客

结论:
  在游标生成时的那个时间点(Point in Time),结果集已经确定,不会因为删除了t里面的数据而引起结果集变化。

OPEN 命令返回的结果集在打开的那一刻(时间点)就已经确定。打开时,我们根本没有碰过表中的任何数据块,但答案已经是铁板钉钉的了。获取数据之前,我们无法知 道答案会是什么;不过,从游标角度看,结果则是固定不变的。打开游标时,并非Oracle 将所有数据复制到另外某个位置;实际上是DELETE 命令为我们把数据保留下来,把它放在一个称为undo 段(undo segment)的数据区,这个数据区也称为回滚段(rollback segment)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值