保证Oracle数据库读取一致性的关键是SCN。每一个数据块头都会记录一个事务提交的SCN。同时每一数据块头都包含一个事务表(ITL),事务必须获得一个ITL事务表才能进行数据修改。该事务表用来确定当数据库开始修改数据块时,是否有某个事物还未提交。事务表中的条目描述了哪些事务又被锁定的行,以及块中的哪些行为包含提交和未提交的更改。事务表执行撤销段,提供对数据库所做的更改的时间相关信息。

 
     事务表的内容主要包括:xid(Transaction ID)、UBA(Undo Block Address)和 LCK(Lock Status)。其中UBA指向具体的回滚段。
     一个事务的整体流程如下:
     ● 首先当一个开始时,需要在回滚段事务表上分配一个事务表(事务槽)。
     ● 在数据块头部获取一个ITL事务槽,该事务槽指向回滚段头的事务槽。
     ● 在修改数据之前,需要记录前镜像信息,这个信息以UNDO RECORD的形式存储在回滚段中,回滚段头事务槽指向该记录。
     ● 锁定修改行,修改行锁定位(1b-lock-byte)指向ITL事务槽。
     ● 数据修改可以进行。
 
     那么Oracle到底是如何实现数据读取一致性的呢?举例说明一下,当一条select语句开始执行时,数据库会确定查询开始执行时所记录的SCN。为了保证检索的数据是已提交的数据,那么对应的数据块所记录的SCN不能大于查询执行时的SCN。如果读取到的数据块的SCN大于查询执行时的SCN,说明有数据在查询开始后做了修改,这是就需要利用本数据块块头中的事务表来确定是哪些事务在查询开始后处理过数据(也就是判断各事务处理的SCN,不管是提交还是未提交),然后根据事务的UBA去回滚段读取满足查询条件的数据,这样就能保证读取到的数据的一致性。
     
     读到这里,肯定有人会有疑问,数据块块头的事务表记录了多少事务信息,什么时候会清除这些事务信息?这就涉及到Oracle的块清除机制了。当事务提交后,Oracle会将回滚段上的事务表信息标记为非活动,以便空间可以重用;同时,Oracle还会清除在数据块上存储的ITL和锁定等事务信息(行级锁,提交标识,SCN等)。
     如果提交时修改过的数据块仍然在Buffer Cache中,那么Oracle可以清除ITL信息,这叫做快速块清除(Fast Block Cleanout),快速块清除还有一个限制,当修改的块数量超过Buffer Cache约10%,则对超出部分不再进行快速块清除。
     如果提交事务的时候,修改过的数据块已经被写回到数据文件上(或大量修改超出10%的部分),再次读出该数据块进行修改,显然成本过于高昂,对于这种情况,oracle选择延迟块清除(Delayed Block CLeanout),等到下一次访问该Block时再来清除ITL锁定信息,这就是延迟块清除。Oracle通过延迟块清除来提高数据库的性能,加快提交操作。

深入浅出Oracle数据读取一致性和事务表的更多相关文章

  1. Oracle.数据的增删改、表操作(创建,修改,删除)、数据类型

    SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno; SELECT dname,loc FROM dept; SELECT JO ...

  2. Oracle数据加载之外部表的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...

  3. oracle中的数据读取与查找

    数据读取 首先数据块读入到Buffer Cache中,并将其放在LRU(Last Recently Used)链表的MRU(Most Recently Used)端,当需要再次访问该块时可以直接从bu ...

  4. Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

    Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...

  5. flume-ng-sql-source实现oracle增量数据读取

    一.下载编译flume-ng-sql-source 下载地址:https://github.com/keedio/flume-ng-sql-source.git ,安装说明文档编译和拷贝jar包 嫌麻 ...

  6. C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查

    前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...

  7. Oracle数据泵导出使用并行参数,单个表能否真正的并行?

    对于Oracle 数据泵expdp,impdp是一种逻辑导出导入迁移数据的一个工具,是服务端的工具,常见于DBA人员使用,用于数据迁移.从A库迁移至B库,或者从A用户迁移至B用户等. 那么有个疑问? ...

  8. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  9. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

随机推荐

  1. axios中put和patch的区别(都是update , put是需要提交整个对象资源,patch是可以修改局部)

    patch方法用来更新局部资源,这句话我们该如何理解? 假设我们有一个UserInfo,里面有userId, userName, userGender等10个字段.可你的编辑功能因为需求,在某个特别的 ...

  2. pandas、matplotlib、Numpy模块的简单学习

    目录 一.pandas模块 二.matplotlib模块 1.条形图 2. 直方图 3.折线图 4.散点图+直线图 三.numpy 一.pandas模块 pandas是BSD许可的开源库,为Pytho ...

  3. CSS——相对定位、绝对定位、固定定位

    相对定位: position:relative 当元素被设置相对定位或是绝对定位后,将自动产生层叠,他们的层叠级别自然的高于文本流,除非设置其z-index值为负值. 并且我们发现当相对定位元素进行位 ...

  4. React 之React.createContext

    使用Context,可以跨越组件进行数据传递 import React from 'react'; import ReactDOM from 'react-dom'; const ThemeConte ...

  5. 开发工具Intellij IDEA:面板介绍

    一.面板说明 IDEA面板的全貌如下图 2|0 二.菜单栏 下面会简单介绍下一些常用的部分菜单使用,如有疑问或补充欢迎留言. (1).File文件 1. New:新建一个工程 可以新建project, ...

  6. 配置 app.js 文件

    pp.js 中存放全局的 JavaScript 逻辑. 示例: App({ onLaunch: function () { console.log('SWAN launch'); }, onShow: ...

  7. Python常用框架

    序言 所谓专家,就是在一个很小的领域里把所有错误都犯过了的人--尼尔斯·玻尔 Django Flask Tornado 适合后端微服务 资料 flask

  8. CSS——小三角带边框带阴影

    乍一看,很简单,做小三角,首先想到的是利用border的transparent特性,可以制作出小三角的效果.但是注意,这个小三角本身就是边框制作出来的.怎么能在小三角的外边再加一层小边框呢.那就必须再 ...

  9. Codeforces Round #351(Div 2)

    熬到半夜打结果前一个小时提交代码的页面根本加载不进去,D题写完还因为小点没判被hack掉了... rating什么的都是身外之物了,于是乎喜闻乐见地又掉回绿名了. A题: *题目描述: Bear看一场 ...

  10. 解决:未能加载文件或程序集“MiniProfiler”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

    参考:https://www.lanhusoft.com/Article/120.html 产生的原因: 公司原来的项目用的是MiniProfiler 3.0.11新项目本来想使用4.0,但是无奈网上 ...