问题:会话1,查询一部分数据会话2, 修改数据并提交

会话2在会话1完成之前已经完成

那么会话1得到的数据是新的还是旧的?

答案:

旧的

因为oracleconsistent read的特性,会话1t1时间点查询的数据,应该是在t1时刻存在的数据

所以说,不管会话2如何修改数据,那么会话1因为会分配一个SCN号,查询到的数据的data block都会是时间点1的数据。

所以,查询的数据应该是时间点t1的,而不是会话2提交的数据

Done

其实我在这个部分还是有疑问的,我很奇怪oracle具体是怎么实现一致性读的

其实这个问题在oracle官方文档里,有确定的答案,the exactly answer

In the read commited isolation level,thispoint is the time at which the statement was opened.For example ,if a SELECTstatement opens at SCN 100,then this statement is consistent to SCN 100

这时会比较select语句中scn号和db_buffer中的数据块头部的scn

Select语句确实是有一个SCN

一个select语句初始化的时候,oracle会给它添加一个实时的SCN号,查询的结果将会是在这个SCN点上的数据

当用户执行一条SELECT语句时,ORACLE为它分配一个SCN。该查询语句在搜索需要的数据的数据块时,只会读取SCN小于或等于该SCN的数据块。