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)。
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)。