`

oracle执行DML(事物过程)的深入研究(一)

阅读更多

用户所执行 DML (即执行事务)操作在 Oracle 内部按如下顺序进行。

1.相应事务分配回滚段( undo segment ), 这时优先使用当前联机状态的回滚段中一个。回滚段的选择是随机的,若另外的事务正在使用则重试 3 次, 在此过程中失败, 则将未联机的回滚段联机后使用。 如果此过程也失败, 就会创建新的回滚段, 通过这个过程也没有分配到回滚段, 则使用 Oracle 8i 中使用的回滚段( rollback segment ) 算法。即,使用另外事务使用中的回滚段中用量最少的回滚段。 如果服务器进程在获得回滚段时没有适当的联机状态的回滚段, 则等待 enq:US-contention 事件, 直到有适当的联机状态的回滚段为止。

 2.分配回滚段后,在回滚段头上创建事务表 Slot transaction table slot )。
3.创建事务表后会生成 TXID Transaction ID ),再将此 TXID 分配给当前事务。 TXID 通过 V$TRANSACTION 视图的 XIDUSN XIDSLOT XIDSQN 表现, 这个值指向分给事务的回滚段头上存在的事务表的准确位置。事务必须在分配撤销区域后得到 TXID
4.事务对象的 数据块载入到高速缓冲区,在块头的 ITL Interested Transaction List )上登记事务条目( transaction entry )。如果 ITL 上没有登记条目所需的空间,直到有空间为止,一直等待 enq : TX-allocate ITL entry 事件。
5.将需要修改的块的修改信息存储到 PGA , 存储名为 Change Vector 。修改一行时,一般分别创建撤销头块( change vector#1 )、撤销块( change vector#2 )、 数据块( change vector#3 )相应的 change vector 。 进程将 PGA change vector 以名为 redo record (或 redo entry )复制到重做缓冲区。在复制到重做缓冲区的过程中, 需获得 redo copy 锁存器、 redo allocation 锁存器、 redo writing 锁存器, 在此过程中若发生锁存器争用, 分别等待 latch: redo copy latch: redo allocation latch: redo writing 事件。
6.将之前映像信息( before image ) 记录到撤销块, 继而修改数据块, 被修改的数据块变为脏状态。 而且, 高速缓冲区上创建关于已修改的数据块的 CR consistent read ) 块。 如果需修改的行正在被另外事务所改变(即,修改后事务尚未结束的 状态), 就要等待事务结束, 此时会等待 enq:TX-row lock contention 事件。

7.执行提交( commit )后给事务分配 SCN ,提交信息存储在重做缓冲区。
8.回滚段头的事务表中存储已成功提交的信息,解除包括 TX 锁在内的所有资源占有。

9.重做缓冲区的内容记录在重做日志文件上,修改的块之后被 DBWR 录到数据文件中。

 

 

 

 事物执行用伪码表示如下:

 

//1.分配回滚段,优先从online undo space中分配

 if(online undo segments no space){

  for(i=0;i++,i<3){

   //新事物从新循环申请三次回滚段  

  }

 }

 if(新事物还没有申请到空间){

   //联机offline undo segments,从中分配空间

 }

 if(还没有申请到回滚段空间){

   //使用rollback segment算法,使用另外事物使用中的回滚段中用量最少的回滚段

 }

 if(还没有申请到undo segments){

  //则发生enq:US-contention等待事件,直到能够分配到适当的回滚段为止

 }

 //2.在分配到的回滚段头创建事物表Slot(transaction table slot)

 //3.生成TXID(Transaction ID),并把TXID分配给当前事物

 //4.往高速缓冲区载入事物对象关联的数据块,在块头的TIL(Interested Transaction List)

 登记事物条目(transaction entry)

 if(如果块头上没有登记ITL所需空间){

   //则发生enq:TX-allocate-ITL entry等待事件,直到有空间为止

 }

 //5.PGA存储修改块的修改信息,以Change Vector的格式,Change Vector里面包含(创建撤销块头,撤销块,数据块信息)

 进程将PGAchange vector 以名为redo record(redo entry)复制到重做缓冲区

 //6.将之前映像信息(before image)记录到撤销块,继而修改数据块,被修改的数据块变为脏状态

 并且会在高速缓冲区中创建已修改数据块的一致读块

 if(需修改的块正在被另外事物所改变)

 //发生enq:TX-row lock contention等待事件

 

 //7.执行提交(commit)后给事物分配SCN,提交信息存储在重做缓冲区。

 //8.回滚段头的事物表中存储已成功提交的信息,解除包括TX锁在内的所有资源占用。

 //9.重做缓冲区内容记录在redo log上,修改该的块之后被DBWR记录到数据文件中。

 

 

1
1
分享到:
评论

相关推荐

    Oracle DML触发器的执行顺序.pdf

    Oracle DML 触发器的执行顺序 Oracle 中的 DML 触发器是一种存储在数据库中的 PL/SQL 块,能够自动响应特定事件,以实现一些复杂的业务规则。DML 触发器可以分为三种基本类型:数据操纵语句 (DML) 触发器、数据定义...

    Oracle DDL,DML,DCL,TCL 基础概念

    ### Oracle DDL、DML、DCL、TCL 基础概念 #### DDL (Data Definition Language) 数据定义语言 数据定义语言(DDL)主要用于创建、修改或删除数据库对象,如表、索引、视图等。这些操作通常涉及数据库结构的变更。 ...

    oracle操作数据-DML语句.pptx

    oracle操作数据-DML语句.pptx

    oracle动态过程执行

    在 Oracle 数据库中,动态 SQL 提供了一种灵活的方式来执行不预先定义好的 SQL 语句。这种方式允许开发者在运行时构建 SQL 语句并执行它们,这对于处理未知数据结构或需要动态生成查询的情况非常有用。本文将详细...

    Oracle DML触发器在数据库编程中的应用.pdf

    Oracle DML 触发器是一种特殊类型的存储过程,它可以自动执行 SQL 和 PL/SQL 语句,以响应数据库中的变化。触发器可以在数据库表中的数据变化之前或之后执行,也可以在每个变化行或语句执行一次。 Oracle 允许对一个...

    Oracle OLAP DML Reference 11g Release 2 (11.2)-1640

    OLAP DML(Data Manipulation Language)是Oracle OLAP提供的一种专用的语言,用于创建、管理和操作多维数据集。11g Release 2 (11.2) 是Oracle OLAP的一个特定版本,提供了增强的功能和性能优化。 在11g Release 2...

    在SELECT语句中调用DML函数

    然而,直接在函数中执行DML操作会触发Oracle的错误ORA-14551,这是因为函数内部的DML操作默认是在当前事务中执行的,而SELECT语句不能在同一个事务中同时包含DML操作。 为了解决这个问题,需要在函数中声明`pragma ...

    oracleDML触发器1.ppt

    Oracle DML触发器是数据库管理系统Oracle中的一种特性,它允许开发者在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行一段PL/SQL代码。DML触发器主要用于实现数据完整性、业务规则的强制...

    oracleDML触发器.pptx

    Oracle DML触发器是数据库管理系统Oracle中的一种重要特性,它允许在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行PL/SQL代码块。本篇将详细介绍Oracle DML触发器的相关知识。 1. **...

    oracleDML触发器.ppt

    Oracle DML 触发器是 Oracle 中的一种机制,它可以在特定的事件发生时自动执行某些操作。触发器可以分为 DML 触发器、系统事件触发器、用户事件触发器、管理触发器等几种。 触发器的组成部分包括触发器名称、触发器...

    oracle高级语法(事物、函数、存储过程、触发器、异常)[参照].pdf

    事务是 Oracle 数据库中的一组操作单元,事务可以包含多个 DML 语句,例如插入、更新、删除等。事务的特点是要么全部成功,要么全部失败。事务可以确保数据的一致性和完整性。 事务的类型有两种:读事务和写事务。...

    Oracle执行计划介绍与测试.pdf

    ### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...

    oracle操作数据DML语句.ppt

    Oracle 操作数据 DML 语句是 Database Management System(数据库管理系统)中的一种基本语言,用于操作和管理数据库中的数据。DML 语句是 Data Manipulation Language(数据操作语言)的缩写,主要用于对数据库中...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...

    ORACLE执行计划和SQL调优.pptx

    ORACLE 执行计划和 SQL 调优 ORACLE 执行计划和 SQL 调优是关系数据库管理系统中非常重要的概念。执行计划是 Oracle 优化器生成的,用于描述如何访问数据库中的数据的计划。execute plan 中包括了访问路径、表扫描...

    ORACLE中查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始...

    oracle触发器与存储过程高级编程

    本节将深入探讨“Oracle触发器与存储过程高级编程”的相关知识。 **触发器(Triggers)** 触发器是一种数据库对象,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。通过定义触发器,我们可以...

Global site tag (gtag.js) - Google Analytics