作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


并发控制和一致性读:

允许多用户并发访问是数据库必须满足的功能,那么怎样实现并发访问、控制、数据修改就成了一个重要问题。一方面Oracle通过锁定机制实现数据库的并发控制,另一方面通过多版本(Multi-versioning Model)模型来进行并发数据访问

通过多版本架构,Oracle实现了读取和写入的分离,使得写入不阻塞读取;读取不阻塞修改。这是Oracle数据库区别于其他数据库的一个重要特征。多版本模型在Oracle数据库中是通过一致性读来实现的,一致性读也正是回滚表空间的主要作用之一

Oracle一方面不允许其他用户读取未提交数据,另一方面要保证用户读取的数据来自同一时间点。下面通过下图来解释一下什么是Oracle的一致性读(Consistent Reads)。

一致性读取示意图

假定员工SCOTT的薪水为3000:
⑴ 在T1时间,我们在Session 1查询可以得到这个结果;
⑵ 在T2时间,Session 2进行更新,将SCOTT的薪水增加1000,并未提交(此时数据在内存中已经修改,该Buffer状态变为Dirty);
⑶ 在T3时间,Session 1再次查询,注意此时,Oracle不会允许其他用户看到未提交数据,所以此时,Oracle需要通过回滚段记录的前镜像进行一致性读,将3000恢复出来提供给用户,这是一致性读的作用;
⑷ 在T4时间,Session 2提交该更改,此时数据修改被永久化;
⑸ 在T5时间,其他用户再次查询时,将会看到变化后的数据,也就是“4000”。

在上图中,假定查询开始的时间为T1,则在查询获取的数据块中,如果数据块的提交SCN小于T1,则Oracle接收改数据,如果提交SCN大于T1或者数据被锁定修改尚未记录COMMIT SCN,则Oracle需要通过回滚段构造前镜像来返回结果,这就是一致性读的本质含义。

- The End -