逻辑读取是从数据库高速缓冲区中读取数据块,按照读取数据块的模式不同,一般来说,逻辑读取可以分为即时读取(Current Read)和一致性读取(Consistent Read)。这两者最大的区别在于数据的新旧之分,分别说明如下。
即时读取:在Oracle的数据库高速缓冲区内,任何时候都只会保留一份目前的数据;所谓的即时读取,就是读取目前最新的数据,且通常发生在对数据进行修改与删除作业时。
一致性读取:相信大家都了解,Oracle是一个多用户的数据库系统,所以会发生当A用户开始会话,读取的数据还未读取完成之前,可能会有B用户会话修改A用户正在读取但尚未读取完的数据,这时,如果A用户会话读取到B用户会话修改后的数据,就会造成数据不一致的情况,这是相当严重的问题,而一致性读取就是为了保证数据的一致性。为此,在数据库高速缓冲区中的数据块上,都会有最后一次修改数据块时的SCN(System Change Number,系统修改号码)。如果一个事务(Transaction)需要修改数据块中的数据,会先在撤消段(Undo Segment,或称为Rollback Segment)中保存一份修改前数据和SCN的数据块,然后再更新数据库高速缓冲区中、数据块内的相关数据与其SCN,并标识其为脏(Dirty)数据。当其他用户会话读取数据块时,会先比较数据块上的SCN和自己的SCN,当数据块上的SCN小于等于本身的SCN时,则直接读取数据块上的数据;如果是大于本身的SCN,则会从撤消段中找出修改前的数据块并读取其数据。