图解一个事务操作流程

事务的操作流程

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

   事务ID

       select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;

    例子:在开启事务前查看一下事务的信息,显示为空,证明现在是没有开启事务的

    

      向表中插入数据,开启一个事务

     一个事务开始以后,oracle首先会分配一个事务ID,这个ID是唯一的。

   事务表

       undo表空间的undo段的第一个数据块,存在一个事务表,根据数据块的大小,每一个表最多可以放47个事务。每一个回滚段最多可以47个事务

    在分配到ID后,在undo表空间中找一个undo段,在undo段头块中的事务表中写上自己的信息。一个undo段最多可以有47个活动事务。

      1.oracle尽量的一个事务使用一个回滚段

      2.事务太多而回滚段太少,那么可以多个是事务使用一个回滚段

           3.oracle尽量的将活动的事务均匀的放在回滚段上

   回滚块的段头块

       查看回滚段

        select * from v$rollname;

        

       查看回滚段的地址

        select header_block,header_file from dba_segments where segment_name='_SYSSMU13$';

      alter system dump undo header '_SYSSMU22$';//转储回滚段头 ----存储的名字是以当前会话的进程编号命名的

    查看当前会话的进程编号  

        alter system dump datafile 5 block 4308;//转储回滚段数据块

      事务槽:xid uba(undo block address)1-255个

        一个事务的开始要在两个位置写上事务信息

        1.回滚段的段头块里的事务表上写上事务信息

        2.在要修改的数据块上写上事务信息

        事务槽在具体的数据块中,事务表在回滚段的段头块中

      当一个事务的开启,会有三个地方存放回滚数据

    1.事务表:回滚段的段头块里有事务表 ---- 存储事务信息

    2.事务槽:修改的数据块的块头部事务槽  ---- 存储事务信息

    3.回滚块:存储修改前的数据

  事务开启,在undo表空间中,找一个相对空闲的undo段,然后在undo段的段头块中事务表寻找槽位,写上事务信息xid。同时oracle会给这个事务分配一个undo块,(uba)undo块的地址写到事务表中。

  修改数据:首先事务槽中找到槽位,将事务ID写上,这个事务ID即是一个编号,也是一个地址。之后进行修改数据。

  修改数据前,将修改前的数据写入分配的undo数据块中。同时事务槽中也有uba地址指向的是回滚块。

  剖析xid:既是事务编号,也是地址

      1.使用了哪个回滚段的回滚块 块地址

      2.使用段头块的事务表的哪一行

      3.第几次使用,覆盖次数,循环使用的次数

   以上三点可以唯一标志事务。

oracle在rollback时,首先要找到事务,找到uba,之后再找最新的回滚块。

事务的修改过程

    1.事务开始首先在undo表空间中相对空闲的undo段的段头块中的事务表里,找一行信息将自己的xid信息写上 ,同时在undo段中分配一个回滚块,将回滚块的地址写到事务表的事务槽中。 

    2.修改具体的数据块,将修改前的数据写入回滚块,同时将回滚块的地址写入事务表

    3.当一个回滚块不够用会分配其他的回滚块,这些回滚块之间是串联起来的,还要讲最新的回滚块地址写到事务表中

在hui

      

  

  

   

原文地址:https://www.cnblogs.com/KAJIA1/p/12124288.html