保证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. 《SaltStack技术入门与实践》—— Job管理

    Job管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 在SaltStack里面执行任何一个操作都会在Master上产生一个jid号.Minion ...

  2. 【NOIP2013模拟】DY引擎

    题目 BOSS送给小唐一辆车.小唐开着这辆车从PKU出发去ZJU上课了. 众所周知,天朝公路的收费站超多的.经过观察地图,小唐发现从PKU出发到ZJU的所有路径只会有N(2<=N<=300 ...

  3. IIS部署复盘(杂记)

    首先,230是网站服务器,231主要放到是数据库:所以在230(部署的服务器)上部署不需要部署IIS和Oracle数据库, 231呢?231是数据库服务器:百度一下数据库服务器是什么? 文档第五步: ...

  4. 2,ActiveMQ-入门

    ActiveMQ是Apache出品的,非常流行的消息中间件,可以说要掌握消息中间件,需要从ActiveMQ开始.首先去官网下载:ActiveMQ官网 一,ActiveMQ目录配置文件 1.1,Acti ...

  5. nasm不是内部或外部命令

    使用nasm编译汇编的源文件: nasm -f bin first.asm -o first.bin 报错:nasm不是内部或外部命令,这种错误一看就知道,是没有配置环境变量. 点开后,选择path, ...

  6. kafka broker

    在server.properties文件中配置: 1.broker.id kafka集群是由多个节点组成的,每个节点称为一个broker,中文翻译是代理.每个broker都有一个不同的brokerId ...

  7. 【PowerOJ1751&网络流24题】数字梯形问题(费用流)

    题意: 思路: [问题分析] 求图的最大权不相交路径及其变种,用费用最大流解决. [建模方法] 规则(1) 把梯形中每个位置抽象为两个点<i.a>,<i.b>,建立附加源S汇T ...

  8. GeoServer-2.12安装MbTiles扩展插件

  9. Codeforces Round #603 (Div. 2) E. Editor

    E. Editor 题目链接: https://codeforces.com/contest/1263/problem/E 题目大意: 输入一个字符串S1含有‘(’ , ‘)’ , ‘R’ , ‘L’ ...

  10. RabbitMQ消息如何100%投递成功(六)

    消息如何保障100%的投递成功? 什么是生产端的可靠性投递? 保障消息的成功发出 保障MQ节点的成功接收 发送端收到MQ节点(Broker)确认应答 完善的消息进行补偿机制(如网络问题没有返回确认应答 ...