当前位置: 首页 > 图文教程 > 数据库 > Oracle > 教你应对Oracle检索数据的一致性以及回滚数据

Oracle
Excel VBA连接并操作Oracle
Oracle 外连接实现代码
oracle 存储过程和函数例子
Oracle 数据库操作类
ORACLE 分区表的设计
Oracle 用户权限管理方法
Oracle In和exists not in和not exists的比较分析
利用windows任务计划实现oracle的定期备份
ORACLE11g随RHEL5系统自动启动与关闭的设置方法
在oracle 数据库查询的select 查询字段中关联其他表的方法
plsql和tsql常用函数比对
plsql与tsql的语法不同
ASP.NET调用oracle存储过程实现快速分页
执行drop表操作后数据库无法起动
分析Oracle有时会用索引来查找数据的原因
数据从MySQL迁移到 Oracle的注意事项
快速理解Oracle归档模式的命令及参数
在Oracle里加快SQL执行的三种方法
几条常见的数据库分页 SQL 语句
Oracle9I OCP认证过程

教你应对Oracle检索数据的一致性以及回滚数据


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 80 ::
收藏到网摘: n/a

  Oracle为了保证用户检索数据的一致性, 通过UNDO记录,当用户检索数据库数据时,Oracle总是使用户只能看到被提交过的数据或特定时间点的数据(select语句时间点),UNDO记录会被存放到回滚段中,假如该数据未提交,用户检索数据时,都是从UNDO记录中取得的。
  1. ORACLE检索数据一致性
  先打开一个SecureCRT.(第一个session)
  先建一个表
  SQL> create table c(a int);
  Table created.
  SQL> alter table c add b number;
  Table altered.
  SQL> desc c
  Name Null? Type
  ----------------------------------------- -------- --------------------------------------------
  A NUMBER(38)
  B NUMBER
  表中插入数据并提交
  SQL> insert into c values(1,2);
  1 row created.
  SQL> insert into c values(3,4);
  1 row created.
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 2
  3 4
  SQL> commit;
  Commit complete.
  再打开一个SecureCRT.(第二个session)
  查询
  SQL> select * from c;
  A B
  ---------- --------------------------
  1 2
  3 4
  第一个session更改表中的数据但不提交
  SQL> update c set b=10 where a=1;
  1 row updated.
  第二个session查询(修改但没有提交检索的是UNDO中的数据)
  SQL> select * from c;
  A B
  ---------- --------------------------
  1 2
  3 4
  第一个session提交
  SQL> commit;
  Commit complete.
  第二个会话查询(可见只有提交后才能检索到数据段的数据)
  SQL> select * from c;
  A B
  ---------- -------------------------
  110
  3 4
  结论:如果用户修改数据但没有提交,其它用户检索的都是UNDO段的数据,这样就保证了数据的一致性


  2.回滚数据(事务恢复)
  1.当用户updata数据但还没有提交
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 10
  3 4
  SQL> update c set b=2 where a=1;
  SQL> select * from c;
  A B
  ---------- -----------------------------
  1 2
  3 4
  这时用户突然后悔了,想恢复到原来的状态
  SQL> rollback;
  Rollback complete.
  SQL> commit;
  SQL> select * from c;
  A B
  ---------- -----------------------
  110
  3 4
  可见当用户用命今rollback还能回滚到初始状态。
  2.当用户updata数据且已提交
  当用户updata数据且已提交后,可以根据SCN记录把数据还源。
  先查看原始数据
  SQL> select * from c;
  A B
  ---------- ----------
  110
  3 4
  找到SCN
  SQL> select current_scn from v$database;
  CURRENT_SCN
  -----------
  693636
  现在删除表中的数据并提交
  SQL> delete from c;
  2 rows deleted.
  SQL> commit;
  Commit complete.
  查询(现在表中已没有数据了)
  SQL> select * from c;
  no rows selected
  检索特定SCN的数据
  SQL> select * from c as of scn 693636;
  A B
  ---------- ----------
  110
  3 4
  恢复数据
  SQL> insert into c select * from c as of scn 693636;
  2 rows created.
  SQL> commit;
  Commit complete.
  现在再查询
  SQL> select * from c;
  A B
  ---------- ----------------------
  110
  3 4
  可见可以根据SCN恢复到某一检查点的数据,如果把SCN转换成时间,,就可以把数据恢复到某一时间点。