一.窗口1,以sysdba登录,创建一个小的UNDO 表空间,并将系统的UNDO表空间设置为该空间.
SQL> create undo tablespace undotbs_small datafile
2 'e:/oracle/product/10.2.0/oradata/undotbs_small.dbf' size 1m
3 autoextend off;
SQL> alter system set undo_tablespace=undotbs_small scope=memory;
系统已更改。
SQL> select bytes/1024/1024,maxbytes/1024/1024 from dba_data_files where tablespace_name='UNDOTBS_SMALL';
BYTES/1024/1024 MAXBYTES/1024/1024
--------------- ------------------
1 0
二.窗口2,创建表,并插入一行数据
SQL> connect test/test
已连接。
SQL> create table personnel(pid number(10),name varchar2(30));
表已创建。
SQL> insert into personnel(1,'这是插入数据');
SQL> commit;
提交完成。
三.窗口3,创建serializable事务,并读取第一行数据
SQL> connect test/test
已连接。
SQL> set transaction isolation level serializable;
事务处理集。
SQL> select * from personnel where pid=1;
PID NAME
---------- ------------------------------
1 这是插入数据
四.回到窗口2,执行多次更新
SQL> begin
2 for i in 1..10000 loop
3 update personnel set pid=i,name='这是更改数据';
4 commit;
5 end loop;
6 end;
7 /
PL/SQL 过程已成功完成。
五.窗口3,再查询数据
SQL> /
select * from personnel where pid=1
*
第 1 行出现错误:
ORA-01555: 快照过旧: 回退段号 25 (名称为 "_SYSSMU25$") 过小
六.窗口1,再查询undo表空间的大小
SQL> select bytes/1024/1024,maxbytes/1024/1024 from dba_data_files where tablespace_name='UNDOTBS_SMALL';
BYTES/1024/1024 MAXBYTES/1024/1024
--------------- ------------------
1 0
仍然是1M,没有扩展