oracle有一个多版本与读一致性(multiversioning and read consistency)的特性oracle自动在查询上提供读一致性以使查询所能看到的数据均来自一个时间点上.同样,ORACLE也提供事务中所有查询的一致性.如你的update就是一个事务.

解决方案 »

  1.   

    oracle为保证一致性用回滚段来保存未提交或最近已提交的数据的旧值.
    当查询进行的时候.当前SCN已被决定.因此. 每个查询返回所有截止于在查询执行点上的那个SCN的所有提交的数据.在查询期间发生的其他事务改变不会被用到.
    因此如果在查询前提交该事务.那么数据是可见的.
      

  2.   

    可以看看oracle concepts guide.里面都讲得非常清楚.
      

  3.   

    liuyi8903(tony) :你说到读一至性,关于这点我有个疑问,如果是我更新的,但还没有提交事务,这时我再去查询,我想应该是更新后的数据吧,当然其他人去查应该是更新前的,
    不知道你同不同意
      

  4.   

    是的.你自己可以看到.但是你另外打开一个会话是看不到的.ORACLE不会产生脏读.但是会产生幻影
      

  5.   

    读取操作只会读取读取查询开始时那一时刻的数据,如果数据在读取操作以后发生了变化,则从回滚段中读取old image。
      

  6.   

    可以来看一个例子:ora10R2@standby>select * from a;A          B
    ---------- ----------
    1          100
    2          100
    3          100ora10R2@standby>var cr refcursor;
    ora10R2@standby>begin
      2              open :cr for select * from a;
      3             end;
      4  /PL/SQL 过程已成功完成。
    ora10R2@standby>update a set b='110' where a='3';已更新 1 行。
    ora10R2@standby>print :cr;A          B
    ---------- ----------
    1          100
    2          100
    3          100ora10R2@standby>select * from a;A          B
    ---------- ----------
    1          100
    2          100
    3          110ora10R2@standby>