要想解释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. linux中test与[ ]指令的作用

    linux中test与[ ]指令的作用: 在Linux中,test和[ ]功能是一样的,类似于c语言中的( ).不过Linux的test和[ ]是指令.在和if或者while联用时要用空格分开.

  2. C语言2

    今天总结数组和数据类型,数组就是按一定顺序排列,具有某种相同性质的同类型变量的集合,这些变量具有相同的名字和数据类型(int  char long 等),在内存中顺序排列,并通过下标区分(下标从0开始 ...

  3. js中列表控件排序箭头,在wke中不支持的解决办法

    列表中箭头,实际使用的在线css样式,wke不支持排序箭头(实际是字体)的在线css样式,可以客户端安装对应的字体,之后显示就正常了.

  4. 【RabbitMQ】 WorkQueues

    消息分发 在[RabbitMQ] HelloWorld中我们写了发送/接收消息的程序.这次我们将创建一个Work Queue用来在多个消费者之间分配耗时任务. Work Queues(又称为:Task ...

  5. 如何用shared_ptr减少锁的争用

    在并发环境下锁的使用是家常便饭, 如何减少锁的使用是优化程序性能的一个方面. c++11里面新增了智能指针std::shared_ptr, 这个东西也许能给我们带来些启发. shared_ptr的一个 ...

  6. angular 数据绑定

    1.ng-band 使用在index.html页面使用,该页面不要直接使用双花括号,否则网络延迟的时候页面会显示双花括号,由于通常只在index.html里导入angular.js,所以在其他模板页面 ...

  7. [skill][gdb] gdb 多线程调试

    中文快速入门: http://coolshell.cn/articles/3643.html (关于多线程的部署说的并不太对) 进阶: 多进程相关概念: inferiors 是什么? http://m ...

  8. Title Case a Sentence

    解决思路 将字符串转换成小写 把字符串分割成字符串数组 循环数组将每一个单词首字母大写 把数组所有的元素转换成一个字符串 第一种方法 function titleCase(str) { str=str ...

  9. Husky or C++ API - HDFS Short-Circuit Local Reads

    hdfs-site.xml added: <property> <name>dfs.client.read.shortcircuit</name> <valu ...

  10. 移动到web整理

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...