要想解释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. Codeforces Round #371 (Div. 2) C

    传送门  map或者字典数的应用 简单题 题意: 思路: AC代码: #include<iostream> #include<cstring> #include<cmat ...

  2. Struts2_ValueStack,OGNL详解(转)

    原文地址:http://blog.csdn.net/wyply115/article/details/8257140 一.OGNL表达式 1.ognl是struts2中使用的一种表达式语言,可用于js ...

  3. virtualenv

    问题:python开发过程中,需要安装各类依赖 逐个安装依赖,操作复杂,并可能会出现版本不一致的问题 解决:virtualenv可以有效解决上述问题 使用方法: 安装: pip install vir ...

  4. Thinking in Java——笔记(15)

    Generics The term "generic" means "pertaining or appropriate to large groups of class ...

  5. Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法

    由于近期在某项目中使用sharepoint client 对象模型做项目 在sharepoint 2010环境下正常,但迁移到sharepoint 2013后报错,提示如下 Cannot invoke ...

  6. phpexcel 导出 科学计数问题

    今天在用php做excel导出的时候遇到了一个小问题,如图 单元格默认格式为常规格式,当数值过长时就会变成科学计数. 解决方法: 如果输出的excel的$data数据是手动添加的,那就在对应值得后面添 ...

  7. 微博开放平台api使用

    前言:微博开放平台提供了微博数据的api接口,不仅可以直接通过api调用微博服务发布微博查询微博,更重要的是,可以在自己的网站上获得新浪微博api的授权,调用微博的某些内容,就好像我们再网站中看到好文 ...

  8. p6 备忘录

    1.报表执行过程:PROC_PM_RP_Implent,PROC_PM_RP_Implent 2.新增用户无法获取p6 计划,主要是因为没有项目信息.分类码授权(计划分类).

  9. 对Live Writer支持的继续改进:设置随笔地址别名(EntryName)

    在我们发布[功能改进]Live Writer发博支持"建分类.加标签.写摘要"之后,Artech提了一个很好的建议:希望在Live Writer发布随笔时可以设置EntryName ...

  10. inotify监控目录变化重启服务器tornado项目

    pycharm 配置了提交服务器项目每次pycharm修改后,虽然保存到服务器但是项目还得自己去服务器kill再启动.就花几分钟写了shell脚本用于监控项目目录变化并重启tornado项目的脚本 如 ...