zoukankan      html  css  js  c++  java
  • oracle保证读一致性原理

    35

    这里也有讲解

    1:undo segment的概念

                      当数据库进行修改的时候,需要把保存到以前的old的数据保存到一个地方,然后进行修改,用于保存old数据的segment 就是undo segment。

    以前老的东西是可以被覆盖掉的,因为undo segment是一种循环利用的方式。 看下图


    如上图所示:

    当oracle开启一个事务对table表中的数据进行修改,修改的那个数据(行数据)会被拷贝到 右图 undo  segment(用圆形表示是因为表示会被覆盖)中,这个时候事务没有提交,在这个时候查询table中的数据,进行全部查询的时候, 当进行全表扫描 扫描到 被事务修改的数据时候,oracle发现这是一条在事务中没有提交的数据,就会到 对应的

    undo segment中进行查找以前的数据,这样 只要修改该表的事务没有提交,oracle查询这个表得到的数据就是以前没有修改的数据。 这样就保证了 读一致性。


    下面这个图是oracle online doc上面的图: 联机文档中的解释为:



    解释上图:  

    SCN  (System change  number): 这个号相当于oracle数据库的一个自己 的时钟,用于记录数据改变的时刻。

    Rollback  segment和 undo  segment 是同义的。


    图中 黑色的标记 代表  oracle 中用户有一个事务正在对这两个数据(scn为 10024)进行处理, 当事务开启的时候,oracle会首先把表中的这两个数据拷贝到 undo segment中, 拷贝的这两个数据都带有 各自的 SCN号。 如上图所示,这两个数据的未被修改前的 SCN分别为: 10008 和 10021.

    当修改这两个数据的时候 ,会给这两个数据赋予新的 SCN (就相当于一个标记什么时刻修改的这个数据)。这个时候修改这两个数据(SCN为 10008和 10021正在进行),事务正在进行没有提交。


    查询的执行的sql语句也会有一个SCN(这个SCN是这个表最后一次修改提交的SCN)

    这个时候 ,有一个查询需要对这个表进行全表扫描(select  *  from  table_name) , 开始执行查询的时候会有一个 SCN号,然后对这个表进行全表扫描,当扫描 的时候,oracle会用当前查询的SCN和这个表中每个数据的SCN号进行比较,如果这个数据的SCN小于<查询的SCN号,证明这个数据当前没有修改,如果这个数据的

    SCN >大于 当前查询的SCN号,表示这个数据在当前查询时刻正在有事务对这个数据进行修改,这个时候查询会到对应的undo segment中查找,SCN< 当前查询的SCN的数据(也就是事务修改前的数据(这里指 10008 和 100021 这个两个数据)),然后一起把这些数据返回, 得到的数据就是事务没有修改前的数据。

    这样即使有多个事务对这个表进行修改,查询得到的结果依然是事务没有提交前的 原来的数据。 这样就保持了读一致性。




  • 相关阅读:
    HTML5 Video/Audio播放本地文件
    jquery 美化弹出提示 漂亮的Dialog 对话框
    JavaScript中变量、作用域、内存问题
    利用nethogs查看哪些进程占用网络带宽
    Dell服务器硬件监控,使用omreport出现object not found 错误解决
    filebeat收集nginx的json格式日志
    利用logrotate切割nginx的access.log日志
    Linux下单机部署ELK日志收集、分析环境
    linux开启Rsyslog服务收集日志
    mysql占用磁盘IO过高的解决办法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161466.html
Copyright © 2011-2022 走看看