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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17014649/viewspace-604288/