Quantcast
Channel: DBA Sky » Oracle
Viewing all articles
Browse latest Browse all 20

关于一致性读的几个知识点

$
0
0

http://blog.csdn.net/biti_rainy/article/details/34554
同一个BLOCK中的数据,只要有一条被更新,即使只查询没有被更新的数据,甚至通过索引直接由  ROWID 查询数据,我们可以想象为根本就不看被更新的数据一眼,但是,依然会产生 CR  block  

CR并不是因为查看到的数据被更改过才去产生一致读,而是只要block里面存在活动事务、或者 block SCN > 查询SCN 都会产生 CR block
若存在没有活动的事务但是还没有产生commit SCN 的(ITL 中 fsc 项为0) 则先产生 delay  block  cleanout

0×1 xid: 0×0005.040.00000117 uba: 0x0080233e.01f9.11 –U- 10 fsc 0×0000.0272a3b7  

XID 是当前事务的事务表信息
而 uba 该事务的回滚段的地址 

回滚段中记录的关于block的改变,除了数据的改变还有 ITL 的改变

  
所以根据当前 ITL 信息可以产生CR block,CR block 里面包含了原来的ITL信息, 这样根据before ITL 信息产生 CR block ,这个CR block 里面包含了before  ITL ,这样又继续重复这个过程,直到 commit scn 都小于 查询SCN 的 block 或者不再有ITL为止,产生 CR 的过程结束,若没有找到就返回 1555 错误
  
当然,不一定非要是查询到的记录上有XID 信息,这依然成立,行上的 lock 主要是针对 DML 起作用

对于select 是以时间点为准的,对于 DML 不是以时间点为准的,也就是说current  mode ,当前看见的是什么就是什么,而不管时间点的一致性和过去是什么

query mode  ——–  consistent gets
current mode ——– db block gets


Viewing all articles
Browse latest Browse all 20

Trending Articles