问题:会话1,查询一部分数据会话2, 修改数据并提交
会话2在会话1完成之前已经完成
那么会话1得到的数据是新的还是旧的?
答案:
旧的
因为oracle的consistent read的特性,会话1在t1时间点查询的数据,应该是在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的数据块。