概述

很多时候我们总会看到CR,但是CR具体是什么?又有什么作用呢?当ORACLE 发生一致性读得时候,会利用UNDO块和当前数据块构造CR块来获得一致性读。但是既然UNDO已经记录了前镜像,为什么还要辛苦的构造CR块呢?直接读取UNDO不就好了吗?下面一起来探讨下CR。


CR块

Cr块(consistent read块)也就是用来维护oracle的读一致性的数据块。当查询某些数据的时候,发现数据块的版本比我们要查询的新,例如session1执行了dml操作并没有提交,session2此时查找跟session1相关的dml操作的数据信息,此时查询的数据却是原来的数据信息。

查询的过程会在undo段中查找该数据块的前映像后,然后把前映像和current块合并形成了一个CR block,通过查询cr block就可以满足数据的一致性了。

CR block存在与sga的buffer cache中,在db cache里申请一个数据块,然后对应的回滚段的前映像生成cr block。

cr块的数量是由隐含参数_db_block_max_cr_dba控制的,默认是最高同时存在5个cr块,构造cr块时cr block created计数器都会增加1.

由于cr block和current block的数据块的rdba都是相同的,会放在相同的hash链上,当然某些block的cr block的版本过多,自然会引起hash链上的竞争,导致latch buffer cache chain闩竞争。

当然在利用回滚段的前映像和current block构造cr块时,很有可能回滚段的已经被覆盖,也就会出现常见的ora-01555快照过旧。

一个sql语句如何去查询数据信息了,根据以前的latch基本记载知道获取该数据块的latch然后才能对该数据块进行读取,其实一个sql访问数据信息的数据块,需要像链接一样的结构中去收索这个数据块是否在内存中,此时访问链表也需要一个latch,如果获取失败也就是会产生latch buffer cache chain等待了。


构造一致性读,ORACLE需要做的工作

1)克隆这个块到另一个buffer,克隆的块跟之前的current块在一个HASH CHAIN上。我们后面的四个步骤,就是发生在新克隆的块上的。

2)如果这个块上存在 延迟块清除或者快速块清除,那么对它进行块清除的动作。

3)对于块上所有未提交的事务进行块级别的回滚,注意这里并不是回滚整个事务,而是只针对事务里修改了这个块的操作进行回滚。

4)检查ITL槽位里,COMMIT SCN有没有大于查询时刻SCN(snapshot SCN)的条目,如果有的话,对这个条目涉及到的事务进行块级别的回滚(类似步骤3)。

5)如果回滚后,ITL槽位里依然有大于查询时刻SCN的条目,重复步骤四。

有几点需要说明:

1)构造一致性读发生在克隆块上,不产生日志。但是在步骤2上,虽然科隆块不产生日志,但是current block由于也需要做块清除,所以会产生日志。

2)步骤四可能会发生多次。如果查询耗时较长,在读取到某个块前,N个事务已经对它做了修改提交,那么这个块就要发生N次步骤4的操作。

3)构造出来的一致性读的块一般由于TCH数很小很容易被LUR算法抛弃重用。

4)一致性读取回滚的只是这个块,假如一个事务修改了1000个块,产生了1000个undo record,但是只有1个undo recored是这个块产生的,那么oracle能够根据ITL槽位里记录的UBA快速的识别到这个undo record,而其他的999条,不会读取。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

oracle增加表字段_史上最详细的oracle 中的CR块介绍--一致性读相关推荐

  1. vscode win10笔记本 蓝屏_史上最详细的win10蓝屏错误代码大全详解

    [文章导读] 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有上百种,有些网友对于蓝屏代码比较头疼,下面小编给大家分享史上最全的蓝屏代码大全. 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有 ...

  2. oracle tns 代理配置_史上最全Oracle安装配置图文教程,含TNS配置

    12C R1多了这个步骤 出现以下错误,点击"全部忽略" 有时候,如果当前操作系统用户名有中文或有空格,这两个步骤会报错,如果报错,oracle服务都不会安装成功,1521端口也没 ...

  3. mysql 回滚段_史上最牛分析MySQL索引机制的实现!不接受反驳

    数据库是一个只要从事后端开发,就永远离不开的技术,大部分企业选择的数据库都是MySQL,所以需要我们对MySQL有着足够的了解. 而MySQL索引,我们都知道提高性能要加索引,也知道索引的结构是B-T ...

  4. oracle增加表字段、修改表字段、删除表字段

    增加表字段 alter table 表名 add 字段名 数据类型(长度) default 默认值 是否为空: 例如: alter table emp add name varchar2(50) de ...

  5. 违反协议 oracle,Oracle增加表字段导致“违反协议”异常

    修正里面漏了ValidConnectionChecker的初始化: private void initValidConnectionChecker() { String realDriverClass ...

  6. python使用kafka原理详解真实完整版_史上最详细Kafka原理总结

    Kafka Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实 ...

  7. mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用

    电脑快捷键可以帮助你提高工作效率,是使用电脑过程中经常用到的,苹果电脑的快捷键和普通PC不太一样,对于新手来说,经常找不到或不知道快捷键是什么,经常要去查,所以这边系统城小编跟大家介绍macbook快 ...

  8. idea没有out文件夹_史上最详细没有之一的 Java JNI傻瓜级入门教程

    本文使用java的IDEA和visual studio2017来详细的一步一步演示java的JNI构建过程(eclipse+vs2017的教程在文末) 1.打开java的IDEA,file->n ...

  9. python xgboost实战_史上最详细的XGBoost实战

    0. 环境介绍 Python 版 本: 3.6.2 操作系统 : Windows 集成开发环境: PyCharm 1. 安装Python环境 安装Python 首先,我们需要安装Python环境.本人 ...

  10. java页面渲染_史上最详细的页面渲染机制

    页面的渲染过程 当我们在浏览器里输入一个 URL 后,最终会呈现一个完整的网页.会经历以下几个步骤: 1.HTML 的加载 页面上输入 URL 后,会先拿到 HTML 文件.HTML是一个页面的基础, ...

最新文章

  1. wifi无线破解(BT4)
  2. why-and-howto-calculate-your-events-per-second
  3. ABAP,Java, nodejs和go语言的web server编程
  4. comboBox绑定数据库后SelectedIndexChanged事件出错
  5. Hibernate Criteria示例教程
  6. B站处罚百万粉丝UP主LexBurner:封禁账号 起诉追究法律责任
  7. 确认取消按钮{删除接口循环返回的数据}
  8. 杜拉拉升职记(1和2)
  9. 20155226实验四
  10. linux系统怎么启动u盘启动盘,如何制作 linux 系统 U盘启动盘
  11. 如何自学html5 web前端工程师培训视频教程
  12. layui使用tips_layui的tips层怎么用
  13. html制作好看的五子棋(源码)
  14. 敏捷测试团队组织构成
  15. 网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击
  16. mysql的基本介绍_mysql基本介绍
  17. np array 存储 json格式文件的写入与读取
  18. MoveIT-Noetic Assistant 总结
  19. ORACLE和MYSQL的九大区别
  20. Google Map开发系列(六)——谷歌地图坐标定位

热门文章

  1. 三星 NAND 存储器新厂施工顺遂,上半年有望如期投产
  2. [css]通过transform缩放邮件客户端h5页面
  3. 测试Flume-1.6.0写入HDFS(Hadoop-2.7.2)的简单实例
  4. ios控件 UIViewController
  5. Jquery 查看DOM上绑定的事件列表
  6. C++笔试题 String类的实现 三大复制控制函数
  7. HTML5 vs. Flash:Adobe面向何方?
  8. 体验ASP.NET 2.0客户端回调功能(CallBack)
  9. 23. 实例 --- 变量
  10. 15. PHP 全局变量 - 超全局变量