Tom 说的
REPEATABLE READ :REPEATABLE READ is the isolation level that the SQL standard claims will guarantee a read-consistent result from a query.这个是所谓的标准里面的可重复读,这个就是ORACLE里面的一致读.(我上面说的有错?还是这个TOM说的话有错?)
ORACLE除了这个一致读,没有其他读.它读不出什么"幻象读",没有.
However, in Oracle Database, READ COMMITTED has all of the attributes required to achieve read-consistent queries. In other databases, READ COMMITTED queries can and will return answers that never existed in the database. Moreover, Oracle Database also supports the spirit of READ UNCOMMITTED. The goal of providing a dirty read is to supply a nonblocking read, whereby queries are not blocked by, and do not block, updates of the same data. However, Oracle Database doesn't need dirty reads to achieve this goal, nor does it support them. Dirty reads are an implementation other databases must use to provide nonblocking reads.
ORACLE里面的"READ COMMITTED "实现了所谓标准里面的"REPEATABLE READ ".所以,ORACLE里面的READ COMMITTED 和所谓标准里面的READ COMMITTED 不是一回事情.虽然ORACLE里面也叫READ COMMITTED ,但是那完全不是那回事情.
一般来说,我不太相信别人说的话,除了TOM和ORACLE的官方文档,还有jonathan。
1:tom
2:jonathan
3: official documents.
当他们三个不一致的时候,按这个顺序采纳.我已经发现多出ORACLE的official documents和TOM说的不一致(甚至相反)的情况,最后的结果无一例外经过实验证明都是TOM正确.我从不使用wikipedia 来学习ORACLE.因为我读到太多的人的学习笔记概念一塔糊涂错误一堆.我一般自己DUMP数据结构出来自己看,实在不清楚的看看TOM和JONATHAN的书,就算没有直接点穿我的问题也能给我启发.
多版本控制是ORACLE比较核心的技术,我不知道我说的是否有哪里和TOM说的不一致?呵呵,如果有请指教.我可以怀疑任何人或者我自己,但是我不可能怀疑TOM。我对多版本控制的理解就来自与TOM.
你做做一个UPDATE的时候从V$TRANSACTION里面查到并且把会滚段里面的数据结构DUMP出来你就应该看到ORACLE没有其他的乱七八糟的这个读那个读.实践可以解决所有困惑,TOM教给我的又一个道理.
alter system datafile undodata_file block blocknumber
多版本控制,ORACLE在内存中可以作到最高6个VERSIONS.
我确信我说的和TOM说的没有出入,因为我对隔离级别和多版本的认识正来自与你给的这个TOM的文章.我刚学习的时候把这个文章连同中文翻译的读了5次以上。后来就不用读了,因为我把整个过程DUMP出来看了,不需要再去读了。
你仔细看看TOM的文章.ORACLE的隔离级别,如果硬要算就只有2个.
1:READ COMMITTED ,也就是所谓的事务并行,也就是所谓的可重复读(ORACLE里面叫一直性读).
2:所有事务串行.
漏了一点,ORACLE还有一个READ ONLY.这个隔离级别实际上是不准许SESSION更改数据的情况下一直性查询,本质上还是READ COMMITTED (ORACLE里面叫一直性读),只不过所有相关的CURSOR在TRANSACTION开始的时候一瞬间全部打开.这个本质上和1是一样的.
TOM说的:
重要的是你要知道后台发生了啥.
MVCC这样的概念,当我刚接触的时候我很看中TOM的文章,因为我没有DUMP过整个过程的文件.当我这么做了以后,我发现我知道ORACLE后台的动作了,于是 TOM的文章可有可无了.道理就是TOM上面的话.
“ORACLE因MVCC所以可以不用4就行,但是目前MVCC大部分数据库都是支持的,不是ORACLE独门绝迹,其它保留4的数据库,只是把dirtyread作为feature或者后向兼容”。感觉你读TOM的文章的时候不是很仔细,只扫了几个关键字,因为你没有读到下面的话
Oracle explicitly supports the READ COMMITTED and SERIALIZABLE isolation levels as they're defined in the standard. However, this doesn't tell the whole story. The SQL standard was trying to set up isolation levels that would permit various degrees of consistency for queries performed at each level. REPEATABLE READ is the isolation level that the SQL standard claims will guarantee a read-consistent result from a query. In the SQL standard definition, READ COMMITTED doesn't give you consistent results, and READ UNCOMMITTED is the level to use to get nonblocking reads.
如果你把整个UPDATE过程中从BUFFER BLOCK到REDO LOG还有 undo tbs都DUMP出来看了的话,你就会发现TOM的文章写得非常的晦涩(其实后面的原理很容易理解了),因为很简单:ORACLE里面的隔离级别和教科书上面的不一样,而且他们都使用的READ COMMITTED 却又不是相同的概念。仔细研究TOM的文章,你会发现在其他数据库中的READ COMMITTED 是幻想读的一个情况,但是在ORACLE中READ COMMITTED 却是其他数据库中的REPEATABLE READ .....MY GOD.很饶口.如果不清楚后台的动作的确很迷糊.
TOM在文章里面说了这么多乱七八糟的这个读那个读,是为了和ORACLE做对比,而不是说ORACLE有这些读。
其他数据库不是不可以实现MVCC,而是代价太高。所以为了少代价搞了一对乌七八糟的“这个读那个读”来糊弄。其他数据库使用REPEATABLE READ(也就是ORACLE 的READ COMMITTED ,一般叫CONSISTENT READ) 代价奇大。
MVCC不是ORACLE的特质,但是从使用UNDO TBS来实现MVCC来说是ORACLE的特性。
[ 本帖最后由 ma.qy 于 14-5-2010 01:11 编辑 ] |