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块会被其他事务使用其剩余的空间。
相关推荐
"涂抹Oracle源代码"这个主题,实际上是指通过阅读和理解Oracle数据库的源代码来深入探究其工作原理,这对于数据库管理员、开发者以及性能优化专家来说都是一个极富挑战性的任务。 Oracle的源代码包含了大量的C++和...
在物理结构方面,Oracle主要由以下几个核心组件构成: 1. 控制文件:记录数据库的状态和元数据,确保数据的一致性和完整性。它是数据库恢复的关键部分。 2. 数据文件:存储数据库的实际数据,每个表空间由一个或多...
1. DDL:包括CREATE、ALTER、DROP等命令,用于定义数据库对象,如表、视图、索引等。例如,CREATE TABLE语句用于创建新表,ALTER TABLE用于修改已有表的结构,DROP TABLE则用于删除表。 2. DML:包括INSERT、UPDATE...
数据库是存储和管理信息的核心工具,对于学习和研究IT领域,尤其是数据分析、软件开发和信息管理等方向,具有至关重要的作用。"数据库资料各种各样的资历"这一标题表明这是一份包含多种类型数据库资源的集合,可能...
20220607R4s9F6ZH.zip
【计算机求职笔试】资源
内容概要:本文详细介绍了基于西门子S7-200 PLC和组态王软件构建的智能楼宇消防系统的设计与实现。首先阐述了硬件配置,包括烟雾传感器、手动报警按钮、排烟风机和声光报警器等设备的连接方式及其IO分配。接着深入解析了梯形图编程的关键逻辑,如输入滤波设置、分层报警策略以及带时间锁的控制流程。同时探讨了组态王监控画面的设计要点,特别是权限管理和报警弹窗的脚本实现。此外,还分享了一些常见的调试问题及解决方案,如电磁阀误动作、信号干扰等问题的处理方法。最终展示了系统的性能优势,强调了实时监测与快速响应的重要性。 适合人群:从事楼宇自动化、工业控制系统设计的技术人员,尤其是对PLC编程和SCADA系统有一定了解的工程师。 使用场景及目标:适用于新建或改造智能楼宇消防系统的项目规划与实施。目标是提高消防系统的响应速度和可靠性,确保在火灾发生时能够迅速采取措施,保障人员生命财产安全。 其他说明:文中提供了大量实际案例和经验教训,有助于读者更好地理解和应用相关技术和方法。
2025姓名配对测算系统最新源码 带后台 一套网上全新的UI,用于姓名配对,支持投流各大平台,全开源可进行二开! 投流的老板可以放心使用这套 后台登录地址:/admin 账号admin 密码admin123
内容概要:本文详细介绍了基于LabVIEW构建的多路压力数据采集系统的硬件配置和软件架构。硬件方面,选择了合适的传感器(如STC的CYZ-102)和信号调理模块(如NI的SCXI-1520),确保系统的精度和稳定性。软件部分强调了DAQ助手的使用、生产者-消费者模式的应用以及TDMS格式的数据存储方法。此外,还分享了许多实用技巧,如差分输入应对电磁干扰、波形图控件优化、数据存储的块大小设置等。通过这些措施,系统实现了高效稳定的多通道压力数据采集,显著缩短了设备故障排查时间。 适合人群:从事工业自动化、数据采集系统设计的技术人员,尤其是有一定LabVIEW基础的研发人员。 使用场景及目标:适用于需要进行多通道压力监测的工业环境,如化工厂、液压测试台等。主要目标是提高数据采集的效率和准确性,减少设备故障排查时间,提升生产效率。 其他说明:文中提供了大量具体的配置代码和实践经验,帮助读者更好地理解和应用相关技术。同时,作者还分享了一些调试过程中遇到的问题及其解决方案,为后续开发提供宝贵的经验参考。
本资源为基于Java的SSM框架民宿管理系统的完整代码,适用于【计算机专业毕设/课设】。通过该项目,您可以快速实现民宿管理相关功能,并且该代码已进行了充分的注释和优化,便于开发者快速理解和二次开发。 资源特色: 功能齐全: 高效实现:代码经过优化,性能稳定, 详细注释:每个模块和函数均附带详细注释,便于理解和学习。帮助您快速上手和部署。 易于扩展:代码结构清晰,方便进行二次开发和功能拓展。 适用人群: 初学者:帮助您快速了解并实现[技术/功能]。 开发者:提供高效的代码实现,助力项目开发。 学术研究:为相关领域的研究人员提供有价值的代码资源。 下载说明: 本资源为付费资源,购买后可获得完整代码 支持提供技术支持,若有问题请及时联系我们。
1、文件说明: Centos8操作系统tbb-devel-2018.2-9.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tbb-devel-2018.2-9.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
Java项目基于Springboot框架的课程设计,包含LW+ppt
软考
matlab
内容概要:本文详细介绍了如何通过西门子S7-200 SMART PLC与施耐德ATV71变频器建立稳定的自动握手通讯方案。主要内容涵盖硬件连接、参数设置、PLC编程实现DriveCom协议状态机、数据校验方法以及触摸屏配置等方面。文中特别强调了断电重启后的自动恢复机制,确保设备能够快速恢复正常运行,避免人工干预。同时,提供了具体的代码片段和注意事项,帮助读者理解和实施这一解决方案。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些负责变频器通讯和控制系统集成的专业人士。 使用场景及目标:适用于需要提高工业现场设备自动化水平的企业,旨在解决变频器断电重启后需要人工重新准备的问题,提升系统的稳定性和可靠性。 其他说明:本文不仅提供理论指导,还包括大量实战经验和具体案例分享,有助于读者更好地掌握相关技术和应对实际问题。
Java项目基于Springboot框架的课程设计,包含LW+ppt
内容概要:本文详细探讨了利用SUMO进行交通仿真的多个关键方面,包括但不限于信号控制、边界管理和车辆编队。首先介绍了通过TraCI接口实现的动态信号灯控制方法,能够根据实时交通状况调整绿灯时长,从而有效降低车辆延误率。其次讨论了高速公路的流量控制策略,如采用渐进式的流速控制和可变限速区来避免因事故造成的严重拥堵。此外,还展示了如何通过协同式自适应巡航控制系统(CACC)实现高效的车辆编队运行,确保车队内部的安全性和稳定性。文中提供了具体的Python代码示例以及XML配置片段,帮助读者更好地理解和实施相关技术。 适合人群:交通工程专业学生、研究人员和技术开发者,特别是对智能交通系统感兴趣的从业者。 使用场景及目标:适用于需要评估不同交通管理策略效果的研究机构或企业;旨在提高城市道路交通效率、减少交通事故发生频率并改善驾驶体验的技术创新项目。 其他说明:作者强调了交通控制参数非线性的特点,并指出在实践中应当灵活运用各种工具和技术手段不断优化仿真模型。同时提醒使用者注意细节之处(如相位编号从零开始),并且鼓励大家充分利用SUMO提供的可视化功能辅助调参工作。
内容概要:本文详细探讨了全球定位系统(GPS)的信号产生、捕获和追踪三个核心步骤,并通过Matlab源码实现相关算法。首先介绍了GPS信号产生的关键要素,包括伪随机码生成、数据编码和信号发射。接着讨论了信号捕获过程,涉及天线接收、码相位测量及其常用方法如滑动相关法。最后阐述了信号追踪的三边测量原理及误差修正措施,如电离层延迟补偿、地形效应补偿和多路径效应修正。通过具体Matlab代码示例展示了整个流程的实现,并附带了详细的运行步骤和结果分析。 适合人群:对GPS系统有兴趣的研究人员和技术爱好者,尤其是有一定编程基础并希望深入了解GPS内部机制的人群。 使用场景及目标:适用于学术研究、工程开发等领域,旨在帮助读者掌握GPS信号处理的基本理论和实践技能,提升定位精度和可靠性。 其他说明:文中提供的Matlab代码已在特定版本下测试通过,但不同版本可能存在差异。此外,还列举了一些参考文献供进一步学习。
Java项目基于Springboot框架的课程设计,包含LW+ppt