oracle保证读一致性原理
 
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 这个两个数据)),然后一起把这些数据返回, 得到的数据就是事务没有修改前的数据。
这样即使有多个事务对这个表进行修改,查询得到的结果依然是事务没有提交前的 原来的数据。 这样就保持了读一致性。

oracle如何保证读一致性 第一弹的更多相关文章

  1. oracle如何保证读一致性 第二弹

    Oracle之数据库一致性读的原理 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(I ...

  2. oracle保证读一致性原理

    35 这里也有讲解 1:undo segment的概念 当数据库进行修改的时候,需要把保存到以前的old的数据保存到一个地方,然后进行修改,用于保存old数据的segment 就是undo segme ...

  3. ORACLE 物理读 逻辑读 一致性读 当前模式读总结浅析

    在ORACLE数据库中有物理读(Physical Reads).逻辑读(Logical Reads).一致性读(Consistant Get).当前模式读(DB Block Gets)等诸多概念,如果 ...

  4. Mysql(三)------事务的特性、事务并发、事务读一致性问题

    1 什么是数据库的事务? 1.1 事务的典型场景 在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还 是配置切面 <tx:advice id="txAdvice& ...

  5. Oracle core05_事务和一致性

    事务和一致性 oracle的redo和undo机制保证了数据库的ACID特性,以及高性能和可恢复特性. redo的数据是记录着数据块变更的顺序的正向数据流, commit时,保证redo同步持久化,保 ...

  6. 深入解读阿里云数据库POLARDB核心功能会话读一致性

    POLARDB架构 我们知道,POLARDB是一个由多个节点构成的数据库集群,一个主节点,多个读节点.对外默认提供两个地址,一个是集群地址,一个是主地址,推荐使用集群地址,因为它具备读写分离功能可以把 ...

  7. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  8. Java基础-程序流程控制第一弹(分支结构/选择结构)

    Java基础-程序流程控制第一弹(分支结构/选择结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.if语句 1>.if语句的第一种格式 if(条件表达式){ 语句体: ...

  9. JVM第一弹

    JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收.堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

随机推荐

  1. HDU 5875 H - Function 用单调栈水过了

    http://acm.hdu.edu.cn/showproblem.php?pid=5875 单调栈,预处理to[i]表示第一个比a[i]小的数字,一直跳就可以. 这题是数据水而已. 这里学习下单调栈 ...

  2. NgStyle和NgIf控制HTML标签显示的区别

    通常web开发者会选择将元素样式属性display设为none来隐藏目标元素.采用这种方式,这些元素虽然不可见却仍然保存在DOM中,这样带来的好处是,如果元素不久就需要再次显示,组件不需要重新被初始化 ...

  3. 在CentOS上源码安装Nginx

    总步骤: wget http://nginx.org/download/nginx-1.10.1.tar.gz tar -xvf nginx-1.10.1.tar.gz cd nginx-1.10.1 ...

  4. JavaScript判断图片是否已经加载完毕的方法汇总

    在网上有很多关于判断图片是否已经加载完毕的文章,但是有的浏览器并不适合,下面小编给大家分享一些有关JavaScript判断图片是否已经加载完毕方法汇总,具体内容如下所示: 一.onload事件 通过监 ...

  5. linux下指定特定用户执行命令

    虽然很简单但是百度找的大部分不能用,我是没找到,后来从google找到的 sudo -H -u www bash -c 'nohup /home/web/ke/upfileserver /home/w ...

  6. Kendo UI Widgets 概述

    UI Widgets 概述 Kendo UI 是基于 jQuery 库开发的,Kendo UI widgets 是以 jQuery 插件形式提供的.这些插件的名称基本上都是以 kendo 作为前缀.比 ...

  7. android studio项目提交Git@OSC

    转载地址:http://www.bubuko.com/infodetail-977061.html 先到git.oscchina.net网站上申请个账号,然后创建一个项目.过程不再说了. 新建工程后, ...

  8. PHP的加解密:如何安装ioncube扩展?

    一.下载loader-wizard.php(支持php5.3.php5.4.php5.5.php5.6版本) ioncube提供了一个安装的向导程序,可以非常方便的帮助检测php的运行环境,自动给出提 ...

  9. 备份和导入Outlook 2016 电子邮件签名

    在本文中,我将分享您在Outlook 2013和Outlook 2016中备份或导入签名的过程 在清除Outlook配置文件之前,请确保您通过在文件资源管理器中的配置文件中的APPDATA文件夹中复制 ...

  10. winform ListView创建columnHeader的方法

    using System; using System.Windows.Forms; using System.Drawing; using System.Collections; namespace ...