保证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. CSS3——制作带动画效果的小图片

    下了一个软件:ScreenToGif用来截取动态图片,终于可以展示我的小动图啦,嘻嘻,敲开心! main.html <!DOCTYPE html> <html lang=" ...

  2. [UVA160]Factors and Factorials 题解

    前言 这道题目本身毫无技术含量珂言,但是输出格式珂以调一年 题解 这道题让我们求\(N!\)中每个质数的个数. 一种方法是直接模拟,枚举\(N!\)中的每个元素,然后暴力查看每个数含有有多少质数. 但 ...

  3. 转载--C++的反思

    转载自http://blog.csdn.net/yapian8/article/details/46983319 最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一 ...

  4. websocket 传输数据帧打包 (client端)

    /* Vertion: 0.2.1 date: 2015.8.11 content: gcc 编译通过 */ //websocket 传输数据帧打包 client端 //参数:src 为输入字符串 / ...

  5. 170929-关于md5加密

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

  6. Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据

    Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据 学习目标 1.学会使用 filter 借助 Lambda 表达式过滤列表.集合.元组中的元素: 2.学会使用列表解析 ...

  7. VXcode学习

    1.安装中文包(chinese) 2.打开控制面板ctrl+shift+p

  8. Idea导入项目详解

    1.点击Import Project选择项目所在目录 2.Import Project选项区别: 1)如果选择Create project from existing sources选项, 则你只能导 ...

  9. floding regions

  10. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈

    2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的.好用吗?好用,这就是数据结构的用处,只不过你在不知不 ...