oracle读一致性分为事务一致读和语句一致读两种,oracle缺省情况下为语句一致读。
事务一致读是指在某一个事务内读的数据不会受其他session修改而改变。
语句一致读是指在某一个时间点读的数据只会是数据库中这个时间点的信息,在读的过程中,若其他session对所读数据做修改将不会被读取。
对于一致读的原理和步骤请参考:http://blog.csdn.net/gybyylx/article/details/6948198
下面我们对语句一致读做个测试:
测试方案:开启一个会话,做循环查询输出,在输出过程中睡眠一段时间,在睡眠时间内另一个会话对表数据做修改,观察第一个会话查询结果是否有变化:
SQL> create table gyb(id number(10),name varchar2(20));
Table created
SQL> insert into gyb values(1,'aa');
1 row inserted
SQL> insert into gyb values(2,'bb');
1 row inserted
SQL> insert into gyb values(3,'cc');
1 row inserted
SQL> commit;
Commit complete
SQL> declare
2 begin
3 for rs (in select * from gyb)
4 loop
5 dbms_output.put_line(rs.id||' '||rs.name);
6 dbms_lock.sleep(10);
7 end loop;
8 end;
9 /
输出结果:
1 aa
2 bb
3 cc
在上面执行输出的过程中,启动另一个会话做以下修改更新操作并提交,发现上面的输出结果并没有变化。
insert into gyb values(4,'insert');
UPDATE gyb SET NAME='update' WHERE ID=3 ;
commit;
结论:在 “3 for rs (in select * from gyb)“这个时间点查询的数据就是数据库中这个时间点的数据,即使在查询完成的过程中,有其他会话做修改,我们也只会查询出这个时间的数据,这就是一致读。