ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 开发成功的oracle应用程序(2)

开发成功的oracle应用程序(2)

原创 Linux操作系统 作者:xw_z 时间:2009-05-27 10:09:29 0 删除 编辑
6.  多版本
       oracle采用多版本、读一致的并发模型,利用该机制提供了一下特性:
       1.  读一致查询:对于一个时间点(point in time),查询会产生一致的结果。
        2. 非阻塞查询:查询不会被写入器阻塞,但在其他数据库中可能不是这样。
        例:create table t as select * from all_users;
                variable x refcursor
                begin
                    open :x for select * from t;
                 end;
                /
                delete from t;
                commit;
                print x
         注意:打开游标时,oracle不复制任何数据,游标会立即打开,它会边行进边回答查询。即:只是在你获取数据时它才从表中读数据。
          即使从表t删除了所有数据,还是可以通过游标获取到数据。open命令返回的结果集再打开的那一刻(时间点)就已经确定,这并非是oracle将所有数据复制到另外某个位置,而是delete命令为我们把数据保留下来,把它放在undo段(undo segment)的数据区。
 
1) 多版本和闪回
       1.  过去,oracle总是基于查询的某个时间点来做决定(从这个时间点开始查询是一致的)。
             游标打开时的时间点:READ COMMITED隔离模式的默认行为,该模式是默认的事务模式。
             查询所属事务开始的时间点: READ ONLY 和 SERIALIZABLE隔离级别的默认行为。
     2.  从oracle9i开始,oracle提供了闪回查询的特性(flashback query)。
      例:variable scn number
              exec :scn := dbms_flashback.get_system_change_number
              select count(*) from emp;       --结果是14
              delete from emp;
              select count(*) from emp;      --结果是0
               select count(*) from emp AS OF SCN:scn;      --结果是14
      3.   oracle 10g及以上版本,可用闪回(flashback)命令把对象返回到以前某个时间点的状态。
        例: flashback table emp to SCN:scn;
                  select count(*) from emp;     --结果是14
       注意:如果得到错误:“ORA-08189:cannot flashback the table because row movement is not enabled using the FLASHBACK command”。则必须先执行一个命令:ALTER TABLE EMP ENABLE ROW MOVEMENT.该命令的作用:允许oracle修改分配给行的rowid.在oracle中,插入一行就会为它分配一个rowid,且该行永远拥有这个rowid。闪回表处理会对EMP完成delete,并且重新插入行,这样就会为这些行分配一个新的rowid。要支持闪回就必须允许oracle执行这个操作。
 
2) 读一致性和非阻塞读
        1.  非阻塞读是这样实现的:oracle只看数据是否改变,它并不关心数据当前是否锁定(锁定意味着数据已经改变)。oracle只是从回滚段中取回原来的值,并继续处理下一个数据块。
          2. 数据的读一致视图总是在SQL语句级执行。SQL语句的结果对于查询开始的时间点来说是一致的。
           例:如下的INSERT也是可预知的:
                  insert into t select * from t;
             
7.  其它杂项
1) 怎么确保最终用户在数据库中只有一个会话?
      解决方案:
                     create profile one_session limit sessions_per_user 1;
                     alter user scott profile one_session;
                     alter system set resource_limit=true;
                     conn scott/tiger             --connected
                    host sqlplus scott/tiger -- ERROROR02391:exceeded simultaneous SESSIONS_PER_USER limit
2) 80%以上(甚至经常是100%)的性能问题都出现在设计和实现级,而不是数据库级。在对数据库上运行的应用进行调优之前,先不要对数据库调优。
 
8.  小结
作为一个oracle开发人员,应该做到:
1) 需要理解oracle体系结构。不要求你精通到能自行重写服务器的程度,不过确实需要有足够的了解,知道使用某个特性的含义。
2) 需要理解锁定和并发控制特性,而且知道每个数据库都以不同的方式实现这些特性。
3) 不要把数据库当作黑盒,也就是说,不要以为无需了解数据库。
4) 用尽可能简单的方法解决问题,要尽量使用oracle提供的内置功能。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-604288/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 使用简单函数
请登录后发表评论 登录
全部评论

注册时间:2009-05-22

  • 博文量
    28
  • 访问量
    38706