热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

OCP知识点讲解之Undo的回滚和提交

一、回滚段块的使用总结:1.1Seq序列值:步骤1:在每个回滚块的块头,有一个SEQ值,当事务延伸到新区时,新区的SEQ是上一区SEQ加1。如:步骤2:步骤3:事务B提交

一、回滚段块的使用总结:1.1Seq序列值:步骤1:在每个回滚块的块头,有一个SEQ值,当事务延伸到新区时,新区的SEQ是上一区SEQ加1。如:步骤2:步骤3:事务B提交

一、回滚段块的使用总结:

1.1 Seq序列值:

在每个回滚块的块头,有一个SEQ值,当事务延伸到新区时,新区的SEQ是上一区SEQ加1。如:

步骤2

步骤4:事务A发布新的更新声明,它所占回滚块开始增长:

事务A增长,占用83、84、85、86、87块,但到达88块时,发现88、89块的序列值也是10,并不小于自身的序列值,事务A跳过88、89块,90块的序列值小于10,事务A占用90号块。

步骤5

事务A继续增长,当事务A延伸至下一区时,香港虚拟主机,下一区块的序列值为11:

结论:只有当事务为块分配的序列值大于块本身的序列值时,事务才可占用此块。上例中事务 B已提交的块,只有当A事务提交后,另有其他事务从末尾区延伸到区0时,才会被占用。

1.2 区的膨胀(Extend):

事务A不断增长,已经占满了区0。事务A又请求新的回滚块,由于事务Z从区1开始,香港服务器,因此区1有“活动事务”,此时Oracle再分配一个新区作为区1,老的区1变为区2,如下:

就算老区1后还有空闲的老区2,此处还是会分配新区1的。

二、回滚和提交:

2.1 回滚:

如果某一事务回滚,其操作步骤是:

从上面的步骤可以看到,回滚的顺序,与你操作的顺序正相反,如果你删除了1,2,3,4,5条记录,然后回滚,Oracle从后向前,依次插入5,4,3,2,1条记录。

2.2 提交:

事务提交后,事务表上的事务状态列被置为非活动。此事务不可再回滚,因为回滚先要到事务表查出事务回滚链的末尾块。

但是,提交后,虽然事务表上已经标明此事务是非活动事务,不过回滚块中的信息还在,虽然不能回滚,但这些回滚块中的信息在被覆盖前,仍是可以被读取的。

关于这一点,我们可以找个事务,提交后再DUMP它占用的回滚块,根据回滚段循环使用原则,这些回滚记录到下一轮循环时才会被覆盖。

三、自己动手构造CR块:

3.1 查询魔术:

PL/SQL 过程已成功完成。

提交完成。

已选择10行。

执行时间过长的查询,有时也会报出这个错误。

3.2 SCN:

在几乎所有的地方,你都能见到SCN。在事务表、回滚块中的回滚记录、数据块、日志文件等等,我们上面曾提到过,在游标中,记录的也有游标打开时的SCN。

3.3 构造CR块:

3.闪回查询中,要求的SCN小于块的SCN,也要去构造CR块。

AAAB3LAAFAAAf/pAAA 131049 j 10

...

下面开始构造CR块,首先说一下末提交时CR块的构造:

第六列,SCN/Fsc,虚拟主机,是事务的SCN信息。0x01事务尚末提交,故此列为0。

18> select scn,to_char(scn,'xxxxxxxxxx') from (select dbms_flashback.get_system_change_number

SCN from dual);

关于CR块的构造过程,我们就讲到这里。在此过程中,我们一直很少用到事务表,在这里,ITL是重要的,我们靠它向前回滚。但在构造CR块的开始,Oracle仍然要读事务表。这一点从X$BH中的“接触点”可以看出来。每发布一次产生CR块的查询,回滚段头的TCH列都有增加。ITL在每个数据块的块头,它是针对块的,而事务表则是针对事务的。

在Rollback时,Oracle一定要去读取事务表,因为一个事务可能涉及很多回滚记录、很多回滚块,这些回滚记录被回滚链串起来,而只有在事务表中,才能找到回滚链尾记录的UBA。因此,回滚一定要从回滚链末尾开始。

本文出自 “叶绍琛” 博客,请务必保留此出处

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
author-avatar
宋十七
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有