事务的操作流程
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