`
sjk2013
  • 浏览: 2245736 次
文章分类
社区版块
存档分类
最新评论

undo系列学习之深入剖析一个事务的操作流程

 
阅读更多

开篇我们先用一个实验引出事务:

sys@ORCL> select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction; 

no rows selected


没找到相应的事务信息,用hr发起一条事务:

hr@ORCL> select * from p;

        ID TEST
---------- -----
         2 f
         3 g
         1 a
hr@ORCL> update p set test='w' where id=1;

1 row updated.


再次查看事务信息:

sys@ORCL> /

XID                  XIDUSN    XIDSLOT     XIDSQN     UBABLK     UBAFIL
---------------- ---------- ---------- ---------- ---------- ----------
02000800E2010000          2          8        482       3339          2


查看hr发起事务所对应的回滚段:

sys@ORCL> select xidusn,sid,username from v$transaction t,v$session s where t.ses_addr=s.saddr;

    XIDUSN        SID USERNAME
---------- ---------- ------------------------------
         2        141 HR
         9        158 SCOTT


查看2号回滚段的段名:

sys@ORCL> select * from v$rollname;

       USN NAME
---------- ------------------------------
         0 SYSTEM
         1 _SYSSMU1$
         2 _SYSSMU2$
         3 _SYSSMU3$
         4 _SYSSMU4$
         5 _SYSSMU5$
         6 _SYSSMU6$
         7 _SYSSMU7$
         8 _SYSSMU8$
         9 _SYSSMU9$
        10 _SYSSMU10$

11 rows selected.


然后把2号回滚段的段头dump出来,到udump目录下去找:

sys@ORCL> select header_block,header_file from dba_segments where segment_name='_SYSSMU2$';

HEADER_BLOCK HEADER_FILE
------------ -----------
          41           2

sys@ORCL> alter system dump undo header '_SYSSMU2$';

System altered.
查看当前会话的server process的进程编号:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid=(select sid from v$mystat where rownum=1));

SPID
------------
5446

2号undo段头部dump出来的部分内容如下:

Version: 0x01
  FREE BLOCK POOL::
    uba: 0x00800017.027b.0b ext: 0x2  spc: 0x19d8
    uba: 0x00000000.027b.02 ext: 0x2  spc: 0x1f06
    uba: 0x00000000.0278.1f ext: 0x10 spc: 0xf54
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0
    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0
  TRN TBL::

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ------------------------------------------------------------------------------------------------
   0x00    9    0x00  0x01e8  0x001d  0x0000.0014d967  0x00800016  0x0000.000.00000000  0x00000001   0x00000000  1343716115
   0x01    9    0x00  0x01e9  0x002d  0x0000.0014db8f  0x00800017  0x0000.000.00000000  0x00000001   0x00000000  1343717092
   0x02    9    0x00  0x01e8  0x0009  0x0000.0014d4b9  0x00800012  0x0000.000.00000000  0x00000001   0x00000000  13437138


这里面有个很重要的概念叫:xid

xid是事务的编号,也是地址,它由三部分组成:

1)使用哪个undo segment header(块号)

2)使用undo segment header里面的事务表的哪一行(行号)

3)是第几次被覆盖(覆盖的次数)

一个事务开始时,会在两个位置,做两件事:

a)在相对空闲的回滚段的段头的事务表(最多47行)标注事务信息,其中包括了xid,uba;并且分配回滚块

b)把要修改的数据块的块头的事务槽(最多255个槽位)上标注事务信息,其中包含了xid,uba

整个过程有四个地方发生了变化:undo segment header,回滚块,数据块的块头,数据块。这四个地方的变化都得到了redo的保护。

分享到:
评论

相关推荐

    专题之Undo工作原理剖析

    ### 专题之Undo工作原理剖析 #### 一、Oracle 10g中Undo表空间的原理 在深入了解Oracle 10g中Undo的工作原理之前,我们先简要回顾一下Undo的概念及其在数据库中的作用。Undo数据是用于实现事务的一致性、隔离性和...

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记

    - **读的一致性**:当一个事务正在执行时,其他事务读取该数据时,Oracle会使用UNDO信息来构造一致性读视图(CR块),确保读者看到的数据是事务开始时的状态。 - **回滚**:如果事务被回滚,Oracle会利用UNDO信息...

    oracle undo详解

    每个事务分配一个Undo段,而一个Undo段可能服务于多个事务。在事务处理过程中,Undo信息用于支持回滚操作,确保在多用户环境中数据的一致性,并防止因事务失败导致的数据丢失。 Undo表空间有其特殊性质,它只能与...

    行业-45 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理!l.rar

    当一个事务开始时,数据库会为这个事务创建一个undo log段,用于存储所有更改操作的原始值。如果事务正常提交,这些记录通常会被清理;但如果事务被回滚,undo log就成为恢复原始数据的关键。 事务的四大特性(ACID...

    Oracle11g体系结构深入剖析和运维管理(五)

    资源名称:Oracle 11g体系结构深入剖析和运维管理(五)资源目录:【】37_深入剖析事务槽及Oracle多种提交方式【】38_OracleIMU及RedoPrivateStrands技术【】39_读一致性(ORA-01555错误机制分析)及Undo表空间大小设置...

    数据库undo表空间问题集锦

    当一个事务进行修改操作时,Oracle会将旧的值存储到undo表空间中,以便在事务回滚或查询历史数据时使用。 2. **Undo表空间利用率** 表空间的利用率是衡量其使用情况的重要指标。高利用率可能表明undo表空间不足,...

    Oracle11g体系结构深入剖析和运维管理(四)

    资源名称:Oracle 11g体系结构深入剖析和运维管理(四)资源目录:【】28_存储结构_段区块【】29_检查点队列(checkpointqueue)【】30_实例崩溃恢复原理剖析【】31_系统改变号(SCN)详解【】32_事务概述【】33_事务ACID...

    redo undo framework source code

    - **操作注册**:每当用户执行一个新的操作,框架需要记录这个操作,创建对应的命令对象,并将其添加到undo栈。 - **撤销与重做管理**:框架需要维护两个栈,一个是undo栈,存储可撤销的操作;另一个是redo栈,...

    Oracle中重做undo表空间

    在Oracle数据库系统中,"重做undo表空间"是一个至关重要的概念,它是数据库事务处理的基础。Undo表空间是用来存储事务撤销操作时所需信息的地方,这些信息被称为重做日志(Redo Log)。当一个事务对数据进行修改时,...

    12c 新特性-Temporary Undo

    - **私有性**:每个会话都有一个私有的Temporary Undo Segment,用于存储该会话所操作的临时表的Undo记录。 **2. Temporary Undo 的生命周期** - **生命周期**:Temporary Undo Segment 的生命周期与创建它的会话...

    相克军 ORACLE 讲座 深度剖析UNDO段 笔记.doc

    UNDO表空间用来存放改变前的旧值。... ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 Undo的三个作用 读的一致性,构造CR块 回滚 实例恢复(时的回滚) --查询UNDO表空间的名字 -----

    53 理解MVCC机制的前奏:undo log版本链是个什么东西?l.pdf

    MVCC(多版本并发控制)机制是数据库事务隔离...undo log版本链通过保存数据的历史状态,让读操作能够无阻塞地访问到一个一致性的数据快照,而无需等待其他事务的完成。这对于实现大规模并发处理有着极其重要的意义。

    mfc support redo/undo

    这个类维护两个堆栈,一个用于保存undo操作,另一个用于保存redo操作。每次用户执行一个可撤销的操作时,都需要向撤销堆栈添加一个新的undo状态。 3. **实现步骤**: - **创建undo对象**:首先,你需要为你的特定...

    C# undo\redo框架

    在开发Windows应用程序时,撤销/重做功能是一个重要的用户交互元素,它允许用户撤销或恢复他们的操作,提高用户体验。在C#中实现这样的框架可以帮助开发者更轻松地为各种编辑控件(如TextBox、RichTextBox、ComboBox...

    oracle undo

    Oracle UNDO 机制是 Oracle 数据库中的一种重要机制,用于记录和回滚事务的操作。UNDO 段是 Oracle 数据库中的一种特殊类型的段,用于存储事务的回滚信息。 undo 段的介绍 undo 段是 Oracle 数据库中的一种特殊...

    Undo

    在IT行业中,“Undo”是一个非常基础且重要的概念,它广泛应用于各种软件和应用程序中,特别是在文本编辑器、图像处理软件以及编程环境中。这个功能允许用户撤销最近的操作,恢复到操作前的状态,极大地提高了工作...

    达梦修改UNDO_RETENTION.zip

    当一个事务执行时,如果发生回滚或者在查询过程中需要查看事务开始前的数据状态,撤销段就会提供这些信息。 在达梦数据库中,修改UNDO_RETENTION参数主要是为了平衡数据库的性能和空间利用率。过短的UNDO_RETENTION...

    ORACLE redo undo.docx

    1. 当事务开始时,Oracle 数据库会创建一个 undo 日志文件,用于记录事务的所有操作。 2. 在事务执行过程中,Oracle 数据库会将所有的操作记录到 undo 日志文件中。 3. 当事务撤销时,Oracle 数据库会将 undo 日志...

Global site tag (gtag.js) - Google Analytics