`
liwenshui322
  • 浏览: 527708 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle事务原理探究1--oracle核心技术读书笔记五

 
阅读更多

1. 冲突解决

       假如有一个系统只有你和我两个用户,并且我们都在持续对系统中一小部分数据做修改和查询操作。

        如果你正在数据库中做一批修改操作,而我正在做查询,我一定不能看到你所做的修改,直到你告诉我可以看到你所做的所有更改才行(你提交了事务)。因此在oracle内部,必须有一个高效的办法来识别哪些数据我可以看到,哪些数据我不可以看到。

       从相反的角度来看,在你提交事务的时候,你需要一种高效的机制让其他所有人能够看到事务已经提交(也就是要告诉别人你所有修改过的数据都是可见的了)。更极端一点的情况是,你可能需要决定回滚事务,这样的话,你也需要一种高效的机制能够关联上所有的undo记录,按生成的顺序排序,从而可以按相反的顺序回滚这些更改。

 

2. 事务与undo

        创建数据库的时候,必须创建一个undo表空间。同时,oracle会在undo表空间中自动创建多个undo段,随着数据库负载的变化自动新增,扩大和收缩。

        事务管理起始于undo段,并以此为中心。undo段的第一个块(段头块)包含如下结构:扩展映射,扩展控制头(跟其他类型的段头块一样),事务表,事务控制区(特殊的结构)。事务表的大概结构如下:

TRN    TBL:

 index   state   cflags     wrap#       uel                  scn                           dba                  nub                 cmt

0X00       9       0X00    0X2013    0X001b  0X0000.016f1fc1   0X0180083e     0X00000001     1302762364

0X01       9       0X00    0X2014    0X001a  0X0000.016f1f54   0X0180083e     0X00000001     1302762364

0X02     10       0X80    0X2013    0X001d  0X0000.016f20fc   0X0180083e     0X00000001      0

0X03       9       0X00    0X200c    0X001c   0X0000.016f20d8  0X0180083e     0X00000001      1302762364

0X04       9       0X00    0X200f     0X001f    0X0000.016f1c75  0X0180083f       0X00000001     1302762364

.........

 

 index 表示事务表中槽号,只是一个序列而已,从0x00开始到0x21结束,11g的版本有34个槽。

state 表示事务状态:9代表事务不活动,10代表事务正在活动,从这里我们看出16进制第0x02号槽上的事务正在活动。

cflags 表示正在使用事务槽的事务的状态:0x00表示非活动事务、0x80表示活动事务、0x10表示死事务、0x90表示被回滚的死事务

wrap# 表示事务表上的事务槽被重用的次数,它是XID的一部分。0x2013表示此时事务槽被重用了8211次。

uel   表示当前活动事务所在事务槽的下一个事务槽的指针(即如果又发生一个新的事务,此时就会用到UEL指向的事务槽上的index)。

scn   表示务事启动、提交、回滚的SCN.

dba   表示uba:第一部分的undo块地址,这个DBA是(rollback)回滚的起始点,也就是说是记录事务修改的最后一条记录所在UNDO块的地址。这使oracle在崩溃恢复时,能够找到事务生成的最后一条undo记录,以便知道从何处开始处理回滚。

nub   表示当前事务所用到的UNDO块的个数。事务回滚时,可以看到该值会逐步减少。

cmt   表示最接近当前的提交时间戳,是从1970年1月1号零晨开始的(以秒为单位记录)。0表示事务正在活动。

 

2.1 事务的开始和结束

       当会话开始一个事务的时候,会先取到一个undo段,从undo段的事务表中取得一条记录,然后增加该记录的wrap#的值,将state改为active(10),同时修改事务表其他一些列(比如cmt置0)。由于这也是对于数据库块的修改,所以会生成一条最终写入重做日志文件的重做改变向量(操作码为5.2),并写入数据库。这样会话就有了一个活动的事务了。

      同样,当事务完成时(通常是用户commit),会将state设回为free(9),并更新其他一些列,比如将当期的SCN写入scn列。同样,对数据库块的这一修改也要生成一个重做改变向量(操作码5.4),最终记录到重做日志中。这一刻相当特别的重要,因为这个时刻你的会话正在向日志写进程(lgwr)发布命令将日志缓冲区的当前内容写入磁盘,并等待日志写进程确认写入完成,以保护所提交的更改。(这个发送命令要求lgwr进程输出重做日志到磁盘其实很简单,一旦发现进入日志缓冲区的重做日志操作码是5.4,也就是是提交事务记录,立刻将所有缓冲区的日志刷新输出磁盘,完成后并告知把这条提交记录放入日志缓冲区的会话。)

      每一个事务会分配一个事务id,事务id由undo段编号,事务表中的条目索引号以及事务条目中最新的wrap#值构成。因此,当你看到像0X0009.002.00002013这样的事务id时,就会知道:这个事务在undo段9里,用的是第2条事务表记录,wrap#值为0X2013。如果你想看这是哪个undo段,以及相应的段头位置,可以使用segment_id列作为查询条件查询dba_rollback_segs视图。

 

2.2 事务表

        在上面我们已经介绍了事务表的结构了,现在回顾一下,事务表主要的目的无非下面几个:

        1. 显示事务是已提交还是仍旧活动

        2. 已提交事务的SCN

        3. 事务生成的最近一条undo记录的位置信息,便于回滚

        4. 事务生成的undo量

        如果一个事务必须回滚,或者一个会话被强制杀掉,使得smon(系统监视进程)必须要回滚它的事务,或者如果实例崩溃,在实例恢复期间,smon必须回滚所有崩溃时的活动事务。那么此时可以轻松找到所有活动事务(状态等于10),并且找到每一个事务正在使用的最后的undo块(dba列)。然后可以根据每一个事务对应的undo块链表往回查找,应用每一条undo记录,因为每一条undo记录指向了本事务中前一条undo记录。

 

2.3 undo块简要介绍

      undo块和普通数据块有许多相似之处:块头部分记录了若干控制信息和元数据,行目录列出了堆积存放在块中的每一项的位置,若干undo记录在块中自底向上堆放在一起,块空闲空间位于块中间。但表行和undo记录最大的区别在于,undo记录不会被修改,因此一旦undo记录被写入块中,会永远保留在相同的位置。(表行被修改之后,如果原来位置放不下,会拷贝到另一个新位置,这样块中会留下杂乱的指针和临时的空洞)。

      一个不太为人知的事实是,单个undo块也可以包含多个事务的undo记录。一个事务会以独占的方式请求undo块的所有权,pin住,然后使用该块直到块满(此时事务请求新undo块并更新它的事务表槽以指向新块)或事务提交。如果事务提交后,undo块中仍有空闲空间,该块会被加入到undo段头中空闲块池的候选链表中。如果发生这种情况,该undo块会被其他事务使用其剩余的空间。

0
0
分享到:
评论

相关推荐

    涂抹oracle源代码

    "涂抹Oracle源代码"这个主题,实际上是指通过阅读和理解Oracle数据库的源代码来深入探究其工作原理,这对于数据库管理员、开发者以及性能优化专家来说都是一个极富挑战性的任务。 Oracle的源代码包含了大量的C++和...

    oracle实用文档

    在物理结构方面,Oracle主要由以下几个核心组件构成: 1. 控制文件:记录数据库的状态和元数据,确保数据的一致性和完整性。它是数据库恢复的关键部分。 2. 数据文件:存储数据库的实际数据,每个表空间由一个或多...

    程序员的SQl金典(学习笔记)

    1. DDL:包括CREATE、ALTER、DROP等命令,用于定义数据库对象,如表、视图、索引等。例如,CREATE TABLE语句用于创建新表,ALTER TABLE用于修改已有表的结构,DROP TABLE则用于删除表。 2. DML:包括INSERT、UPDATE...

    数据库资料各种各样的资历

    数据库是存储和管理信息的核心工具,对于学习和研究IT领域,尤其是数据分析、软件开发和信息管理等方向,具有至关重要的作用。"数据库资料各种各样的资历"这一标题表明这是一份包含多种类型数据库资源的集合,可能...

    车库和车库 CFD 模型 CFD 分析可用于分析模型

    车库和车库 CFD 模型 CFD 分析可用于分析模型。

    henn-produktfolder-thermalmanagement-2024.pdf

    henn-produktfolder-thermalmanagement-2024

    39 Android源代码定时情景模式切换.zip

    39 Android源代码定时情景模式切换.zip

    基于单 神经 元PID控制器的四旋 翼 飞 行 器 航 迹控制.pdf

    基于单 神经 元PID控制器的四旋 翼 飞 行 器 航 迹控制.pdf

    西门子S7 200 Smart PLC与3台台达MS300变频器通讯程序

    内容概要:本文详细介绍了如何使用西门子S7-200 SMART PLC与三台台达MS300变频器进行Modbus RTU通讯的具体步骤和技术要点。首先,文章强调了正确的硬件连接方法,包括PLC与变频器之间的485总线连接以及终端电阻的设置。接着,深入讲解了变频器的关键参数配置,确保通讯稳定可靠。然后,展示了核心程序的设计思路,特别是轮询机制的应用,通过定时中断实现对三台变频器的状态监测和控制。此外,还提供了触摸屏的配置方法,使操作更加直观便捷。最后,分享了一些常见的调试经验和避坑指南,帮助解决实际应用中可能遇到的问题。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC与变频器通讯感兴趣的读者。 使用场景及目标:适用于需要将多台变频器集成到PLC控制系统中的工程项目,旨在提高系统的稳定性和可靠性,同时降低维护成本。 其他说明:文中提供的代码片段和配置建议均基于作者的实际经验,具有较高的实用价值。对于初学者来说,建议先理解基本概念再逐步深入实践。

    7天打造Rust命令行工具:Clap与StructOpt深度对比.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    互联网大厂裁员背后的经济规律与增长天花板.mp4

    互联网大厂裁员背后的经济规律与增长天花板.mp4

    2025年交换原理与技术.zip

    2025年交换原理与技术.zip

    基于PLC的智能农业温室大棚控制系统中电气控制设计与图纸详解 其中包括梯形图程序、接线图及io分配等内容,带您领略组态画面的精彩展示。

    内容概要:本文详细介绍了基于PLC(可编程逻辑控制器)的智能农业温室大棚控制系统的各个方面。主要内容涵盖IO分配、梯形图程序编写、接线图绘制和组态画面设计。通过合理的IO分配,PLC能够准确获取环境数据并控制相关设备;梯形图程序实现了对温度、湿度等环境因素的自动化控制;接线图确保了硬件连接的准确性;组态画面提供了用户友好的操作界面。此外,还分享了一些实际应用场景和技术细节,如温度控制梯形图实战、接线冷知识、组态画面设计技巧以及调试现场的经验。 适合人群:从事农业自动化、工业控制领域的工程师和技术人员,特别是对PLC编程和智能农业感兴趣的读者。 使用场景及目标:适用于希望提高农业生产效率和智能化水平的农场主和农业企业。通过引入PLC控制系统,可以实现对温室环境的精准控制,减少人工干预,提升作物产量和质量。 其他说明:文中不仅提供了理论知识,还包括了许多实践经验,帮助读者更好地理解和应用PLC技术于智能农业中。

    基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档(毕业设计&课程设计&项目开发)

    基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于TypeScript+three.js 实现的三维地质模型剖切,以及剖面的补充+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档

    三菱MCGS组态皮带运输机控制系统:传送带四皮带及梯形图原理详解

    内容概要:本文详细介绍了基于三菱FX3U PLC和MCGS组态软件构建的四皮带运输机控制系统。首先阐述了系统的IO分配规则,强调了关键输入输出信号的选择依据及其重要性。接着深入解析了梯形图编程技巧,展示了如何通过定时器、比较器等指令实现皮带的顺序启动和速度同步控制。随后探讨了MCGS组态界面的设计,包括动态皮带模拟、报警提示以及历史数据记录等功能。最后分享了一些常见故障处理经验和系统优化方法,如合理的接线方式、滤波处理和联锁逻辑设计。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定了解的人群。 使用场景及目标:适用于需要设计和维护复杂皮带传输系统的工厂环境,旨在提高生产效率并确保设备安全可靠运行。 其他说明:文中提供了大量实际案例和调试经验,有助于读者更好地理解和掌握相关技术和最佳实践。

    面板数据-中国各银行流动性创造(2012-2023年).xlsx

    详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/147722861

    Go语言设计模式:单例与工厂模式的并发安全实现.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 编译闪电般迅速,并发性能卓越,部署轻松简单!Go 语言以极简设计理念和出色工程性能,成为云原生时代的首选编程语言。从 Docker 到 Kubernetes,全球顶尖科技企业都在采用 Go。点击了解 Go 语言的核心优势、实战窍门和未来走向,开启高效编程的全新体验!

    基于NB-IoT的智能渔业养殖综合控制系统设计.pdf

    基于NB-IoT的智能渔业养殖综合控制系统设计.pdf

    基于MCGS与PLC技术的饮料灌装生产流水线智能控制解决方案:梯形图程序、接线图与组态画面全解析

    内容概要:本文详细介绍了利用MCGS通用监控系统和西门子S7-300 PLC实现饮料灌装生产流水线的自动化控制方法。首先阐述了IO分配的具体规则,明确各输入输出端口的功能及其所连接的外部设备;接着展示了梯形图程序的设计思路,解释了启动停止控制、传送带控制和灌装控制三个关键环节的工作流程;然后描述了接线图原理图的内容,说明了PLC与外部设备间的物理连接方式;最后讲解了MCGS组态画面的应用,强调了其在人机交互方面的作用。通过这些内容,全面揭示了如何构建一套稳定高效的饮料灌装生产系统。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程及MCGS组态有一定了解的专业人士。 使用场景及目标:适用于需要优化现有饮料灌装生产线的企业,旨在提高生产效率、降低人工成本的同时保证产品质量的一致性和稳定性。通过对文中介绍的技术手段的学习和应用,可以更好地理解和掌握现代工业自动化控制系统的构建方法。 其他说明:文中不仅提供了理论性的指导,还有具体的实例分析,如针对可能出现的问题提出解决方案,使得读者能够在实践中灵活运用所学知识。此外,还提到了一些调试经验和技巧,有助于解决实际工作中遇到的各种挑战。

    Go语言GUI开发:Fyne框架跨平台应用实战.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 编译闪电般迅速,并发性能卓越,部署轻松简单!Go 语言以极简设计理念和出色工程性能,成为云原生时代的首选编程语言。从 Docker 到 Kubernetes,全球顶尖科技企业都在采用 Go。点击了解 Go 语言的核心优势、实战窍门和未来走向,开启高效编程的全新体验!

Global site tag (gtag.js) - Google Analytics