oracle回滚机制深入研究(三)

2014-11-24 16:16:00 · 作者: · 浏览: 15
pc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x04
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 80
ncol: 4 nnew: 1 size: 1
col 3: [ 5] 54 41 42 4c 45
Rec #0x5 记录时我们最后一个update语句使用的第一个undo记录,我们可以看到,该记录中并没有保存事务中上一条语句使用的uba,因此我们可以知道,undo record中的uba参数无法跨越语句,只能在单个语句中将undo记录串联起来
*-----------------------------
* Rec #0x6 slt: 0x00 objn: 73424(0x00011ed0) objd: 73424 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x05
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat bit: 4 (post-11) padding: 1
op: C uba: 0x01400102.0001.05
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 80
ncol: 4 nnew: 1 size: 1
col 3: [ 5] 54 41 42 4c 45


七、一些结论

1.UNDO段头中TRN CTL的uba参数:UNDO段头的事务表中最后(最新)一个事务的对应的undo block上的第一个undo record,即当这个回滚段头存在多个事务时,这个uba表示最新的事务的uba地址,这个地址在整个事务的周期内不发生改变(除非这个回滚段头上又分配了一个新的事务表),因此,这个地址指向的是事务使用的第一个undo block;

2.UNDO BLOCK中undo record记录中的uba参数:如果事务中的一个DML语句需要使用多个undo record,则这个参数指向的是前一个undo record的记录,通过这个参数可以形成同一个DML语句的undo chain tx table。但是一个事务中的不同DML语句,无法通过该参数连接起来(形成undo chain),因为该参数,不能跨越DML语句。当一个事务使用多个undo block时,事务使用的undo块顺序,是根据这个参数串联起来;

3.数据块头的ITL中的uba参数:指向事务在这个数据块上的变更(修改)所使用的undo块中的最后一个undo record偏移量地址,针对这个数据块修改,这个uba是回滚的起点;

4.UNDO record中的bdba表示block address ,hdba表示 segment header address
5.undo块中不会直接保存rowid信息,但是oracle完全可以undo record中几个信息(bdba,slot,objd),生成数据变更是的具体地址(rowid);

6.一个事务所使用的undo记录顺序是通过undo record中的uba参数、rci参数,undo块上的irb,itl中的uba共同起作用来串联变更的顺序,事务的回滚也是根据这个undo chain按顺序完成。其中最关键的两个参数:undo record中的uba 形成单个dml语句的undo chain,rci参数可以跨越DML语句,可以指向事务中前一个dml语句使用的undo record;