保证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. Python---进阶---logging---装饰器打印日志2

    ### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical ---- ...

  2. Python---进阶---文件操作---获取文件夹下所有文件的数量和大小

    一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前的文件夹 - 获取到当前文件夹下面所有的文件 - 处理我们当前的文件夹下面可能有文件夹的情况(也打印出来) - ...

  3. linux运维、架构之路-MySQL备份与恢复(四)

    一.备份方式 ①逻辑备份(文件表示:SQL语句) ②物理备份(数据文件的二进制副本) ③基于快照的备份 ④基于复制的备份 二.备份工具 ①mysqldump:原生自带的逻辑备份工具 ②mysqlbin ...

  4. 状态管理工具对比vuex、redux、flux

    1.为什么要使用状态管路工具  在跨层级的组件之间传递信息,尤其是复杂的组件会非常困难.也不利于开发和维护,这时我们就a需要用到状态管理工具.     2.Flux

  5. CF786B Legacy 线段树优化建图 + spfa

    CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...

  6. sh_01_hello

    sh_01_hello print("hello python") print("你好世界")

  7. All men are brothers

    All men are brothers 牛客多校第九场E 给定n个人,起初互不认识 然后m各阶段 每个阶段有两个人x.y认识 求每个阶段选出四个人互不认识的方式 并查集 #include<bi ...

  8. 转载:String.format()的详细用法

    转载自:https://blog.csdn.net/anita9999/article/details/82346552 问题 在开发的时候一段字符串的中间某一部分是需要可变的 比如一个Textvie ...

  9. win7 编译postgresql9.6.8

    一.环境 windows7 postgresql9.6.8 vs2010 perl5.24.3 二.编译安装 1.安装perl,安装到C:\Perl64路径下,安装完成后设置环境变量PATH和Perl ...

  10. leetcode-mid-array-49 Group Anagrams

    mycode  95.35% 思路:构建字典 class Solution(object): def groupAnagrams(self, strs): """ :ty ...