undo其实就是rollback,用来确保数据的一致性。
undo中数据的特点:
1、是数据修改前的备份,主要是保证用户的读一致性
2、在事务修改数据时产生
3、至少保存到事务结束
下面小实验
SQL> alter user scott identified by tiger account unlock;
User altered.
使用scott账户连接
SQL> conn scott/tiger
Connected.
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7566 JONES MANAGER 7839 02-APR-81 2975
20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400
30
7698 BLAKE MANAGER 7839 01-MAY-81 2850
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7782 CLARK MANAGER 7839 09-JUN-81 2450
10
7788 SCOTT ANALYST 7566 19-APR-87 3000
20
7839 KING PRESIDENT 17-NOV-81 5000
10
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0
30
7876 ADAMS CLERK 7788 23-MAY-87 1100
20
7900 JAMES CLERK 7698 03-DEC-81 950
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7902 FORD ANALYST 7566 03-DEC-81 3000
20
7934 MILLER CLERK 7782 23-JAN-82 1300
10
14 rows selected.
SQL> update emp set sal=4000 where empno=7788
2 ;
1 row updated.
SQL> select * from emp where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7788 SCOTT ANALYST 7566 19-APR-87 4000
20
另外连接一个账户或者session
oracle:/# su - oracle
$ sqlplus / as sysdba
SQL> select * from scott.emp where empno=7788;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7788 SCOTT ANALYST 7566 19-APR-87 3000
20
可以看到未commit,通过oracle的前镜像(old image)进行一致性读,将3000回复出来提供给用户,这就是传说中的一致性读。
当然这里提交了,数据就永久被更改了,那无论那个用户看到的都是4000了。
undo数据的作用:
1、rollback
当用户执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据被放到数据段里。
2、recovery
3、consistent reads
上面的小实验可以看到一致性读,这里面包含着scn的关系,)
用户检索数据库数据时,Oracle总是使用户只能看到被提交的数据(读取提交)或特定时间点的数据(select语句的时间点),这样可以确保数据的一致性。
假定查询开始的时间为t1,则在查询获取的数据块中,如果数据块提交scn小于t1,则oracle获得该数据;当然如果数据块的提交scn大于t1或者数据被锁定修改尚未记录commit scn,则oracle需要从undo段构造前镜像返回结果,这才是一致性读的本质含义。
4.、flashback
通过undo段闪回
undo回滚段的特点:
1.回滚段是由实例自动创建用于支持事务运行的专用段,同样是区和块组成,回滚顶会按实际需要自动进行增长或收缩,是一段可以给指定事务循环使用的存储缓冲区。
2.每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务
3.当一个事务开始的时候,会指定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。
4。在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完,如果当前的盘区不够用,事务会在段中请求扩展下一个盘区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用.
5。回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。