要想解释oracle事物的工作流程,首先先解释几个小概念:

      1、undo段的组成:段头、回滚块

      2、事物ID:每一个事物都有一个自己的事物ID,就像身份证号一样。

在v$transaction数据字典中xid就是事物ID,xid既是一个编号,也是一个地址,xid中内容的有

1、使用哪个回滚段的段头块;

2、一个undo段最多同时能有47个活动事物,一个undo段只有一个事物表,47个事物的情况都在事物表中 ,一个事物占用一行,此次事物使用47中的哪一行;

3、该行被覆盖的次数。这样就组成了唯一的事物ID。

3、事物表:undo表空间的undo段的第一个数据块(即undo段的段头块)里放事物表,共有47行。事物开始第一件事就是在事物表中找到一个空行,写上事物信息。也就是说undo段最多47个活动事物,但是oracle会尽量将一个事物放到一个段上,为了均匀分配(undo段的段头块的位置在dba_segments表空间可以查得)。

oracle中有哪些undo段:

      4、事物槽:在每个数据块的块头部分有事物槽,事物槽包括xid、uba(undo block address)等等。

事物的工作流程:

当事物发生的时候,第一件事会在undo表空间的相对空闲的undo段的段头块的事物表中找到一个槽位,写上事物信息(xid),给这个事物分配一个undo块(undo块里写的就是修改之前的数据),然后将undo块的地址(即uba写到事物表中),所以现在事物表中有xid和uba;第二件事在要修改的数据块的块头的事物槽中找到槽位,写上事物信息(xid),(目的是通过数据块上的xid可以找到事物表),然后在将要修改的数据块上修改数据,修改之前的信息写到undo块里。同时,在事物槽中也写上uba地址,指向回滚块。为什么要在两个地方写事物信息呢?下面有解释。

当回滚块的数据写满之后,系统会自动分配一个回滚块,比如该事物修改了较多的数据,产生3个undo块,3个undo块有先后关系,它们会链起来,但是这是事物表中的uba就只是指向最新的undo块,这是便于回滚。

数据块的事物槽中的uba指向回滚数据,这便于构造CR块。

一个事物一个事物槽,只有当事物提交了,该事物槽才能被覆盖。

pctfree:1、当执行更新操作时,也许会占用pctfree的空间。2、当多个事物操作该数据块时,需要增加事物槽的数量,也会占用pctfree,但是如果事物过多,pctfree不够用了,(之前的事物槽未提交,就不能覆盖,该数据块又有新的事物产生,需要新的事物槽)这样就会产生事物槽争用的情况,大多数发生在update和delete的情况,insert不会发生。因为oracle会尽量的将insert插入的数据插入到多个块中,也就是平均一下,但是update和delete就无能为力了,因为这两个操作往往是针对某一行进行的,而某一行特定就是在这个块里。

如何查看该事物的undo块的位置和undo段头块的位置:

事物槽中的信息:

flag:是否提交

修改的数据块的行的头部指向事物槽,行的头部有事物槽的标记,在事物槽中有事物是否提交的标志,当第二个事物也要修改该行的数据时,发现该行的头部有前一个事物槽的标记,就知道了有事物修改该行,但是是否提交了呢,这时会找该块的事物槽(事物槽中有事物是否提交的标志),由此获知修改该行的先前的事物是否提交。在事物表和事物槽中都有事物信息和是否提交的信息是有作用的,因为如果只有事物表中有信息,那每次dml操作都必须要去查看事物表中的事物信息,会产生事物表的争用,再说在本身的数据块中就有,这样会很方便。

但是也会产生问题,例如一个事物修改1000各块,然后提交,但是要把这1000个块的事物槽的是否提交都要改成已提交,这样会造成提交的非常慢,所以oracle使用快速提交方式,oracle会将事物表中的是否提交标志进行更新,数据块中的事物槽的是否提交标志不更新或少量更新,所以回滚段的事物表的提交信息一定是最准确的,但是数据块的事物槽的是否提交信息不一定准确,如果显示已提交了,那么就一定提交了,若发现事物未提交,第二个事物就怀疑信息是否准确了,它会到回滚块的事物表中去查看(通过数据块的xid找到undo表空间的事物表),若发现事物表中的事物显示已提交,它不但会更新数据,还会将事物槽中的信息显示为已提交,再把该行的头部的事物槽指向第二个事物的事物槽,发现事物表中的事物显示未提交,那么就不会更新数据(行级锁)。sql server这种情况就不行了,sql server没有行级锁,只有块级锁,不能几个事物并发修改该数据块。

-------以上oracle事物的工作流程。

select过程中也许会产生redo,这是为什么呢?在select读块的过程中,如果发现该行的行头部指向某一事物槽(行级锁),它会找到该事物槽,然后查看是否提交,若显示已提交,那么就在读取数据的同时,删除行头部信息(取消行级锁),若事物槽显示未提交,则通过xid找到事物表(事物表中的信息是准确的),若显示已提交,那么在读的同时,会更改事物槽的提交情况,也会删除行头部信息(取消行级锁),若在事物表中显示未提交,那么就通过undo块中的行的数据和该块的未修改的数据一起构成CR块,然后读取CR块。所以select会使数据块发生改变,故而有可能产生redo的

oracle事物的更多相关文章

  1. Oracle事物处理

    n  什么是事物 事物是把对数据库的一系列操作(dml)看做一个整体 事物用于保证数据的一致性,它由一组相关的dml语句组成,改组的dml语句要么全部成功,要么全部失败. 如:网上转账就是典型的要用事 ...

  2. oracle事物总结(转)

    关于Oracle事务的总结 1.什么是事务,事务的特性是什么? 事务的任务便是使数据库从一种状态变换成为另一种状态,这不同于文件系统,它是数据库所特用的.它的特性有四个:TOM总结为ACID即原子性a ...

  3. Oracle事物基础

    事务 1 事务定义 数据库事务是SQL语句的组合作为一个"工作单元".要么全部完成,要么全部不做. 每个事务都有一个开始和一个结束. 2 事务开始 1. 你连接到数据库并执行DML ...

  4. Oracle在Java中事物管理

    对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...

  5. oracle 笔记

    1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...

  6. Oracle中事务处理控制用法

    oracle 事物控制包括 COMMINT ROLLBACK SAVEPOINT avepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepo ...

  7. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...

  8. java面试---summay

    1:合适的建立索引,数据量比较大的时候,如果频繁的进行修改插入则不建议建立索引! 2:什么时候适合建索引,在什么字段上面建立索引? (被当做查询条件的) 3:什么叫做编译错误,什么叫做运行时异常 能被 ...

  9. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

随机推荐

  1. iOS 模仿一个小项目,总结一下里边的模块

      ManoBoo:  参考链接:http://www.jianshu.com/p/fd4c46c31508  这个小的项目是参考ManoBoo的简书的,链接在上方,自己在仿做的过程中,也离不开Man ...

  2. EF Code First之困扰

    Code First自动更新数据库有几种方法 Code First什么都不做 Database.SetInitializer<ShopContext>(null); 发布网站的话一般要在A ...

  3. Html中Table的简单使用

    虽然Table布局已经过时,偶尔还是会用到,简要实用代码,如下: <table border="1" cellpadding="0" cellspacin ...

  4. [工具分享]JetBrains ReSharper 9.0 正式版和注册码

    话不多说.直接上百度云盘分享链接.有需要的盆友去下载吧. 百度云盘:http://pan.baidu.com/s/1kTKIQhh 注册码这里提供一个.有需要的自己拿走.或者可以使用压缩包里面的key ...

  5. selenium使用过程中遇到的“element not visiable”错误

    PS:本博客selenium分类不会记载selenium打开浏览器,定位元素,操作页面元素,切换到iframe,处理alter.confirm和prompt对话框这些在网上随处可见的信息:本博客此分类 ...

  6. Gradle 刷新依赖

    $ ./gradlew build --refresh-dependencies

  7. WordPress基础:小工具的使用

    通过外观->小工具对挂件区域的内容进行调整 比如添加个日历模块 保存后前台就会显示出来 如果不需要,反过来,把模块拖到左边就可以了.

  8. sublime text3配置node.js开发环境

    今天配置sublime下node.js网上搜索很多方法. 首先:传统的方法是 1.GIT方法 可直接输入 Git clone https://github.com/tanepiper/SublimeT ...

  9. KnocKout 绑定数据

    Controller 里面的方法: public ActionResult Index() { return View(); } [HttpPost] public JsonResult Reader ...

  10. 如何添加Tomcat为启动服务

    tomcat8.0, 可以用startup.bat启动, 但注销又不能启动服务,但现在的系统不知出了什么问题 ? 答 1.我这个是zip版本的,所以里面有一个service.bat的文件,所以很简单 ...