ITPub博客

首页 > 应用开发 > IT综合 > itl在被覆盖之前被保存了下来1!

itl在被覆盖之前被保存了下来1!

原创 IT综合 作者:warehouse 时间:2009-03-20 12:28:30 0 删除 编辑
itl在被覆盖之前放在了事务的undo chain(单向链表的尾)的start_ubablk中以备
之后构造consistent read而使用。[@more@]

SQL> create table t(id int) initrans 1;

表已创建。

SQL> insert into t values(1);

已创建 1 行。

SQL> select id,dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_n
umber(rowid) bno from t;

ID FNO BNO
---------- ---------- ----------
1 1 32962
--===============================
session 2:(session 2的这个操作没有任何实际意义,
目的就是占用一个itl)
SQL> insert into t values(2);

已创建 1 行。
--===============================
session 1:
SQL> alter system dump datafile 1 block 32962;

系统已更改。
--========================
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000c.004.0000099e 0x01c0001d.198e.21 ---- 1 fsc 0x0000.00000000
0x02 0x000f.024.00000997 0x01c000e7.18ef.3c ---- 1 fsc 0x0000.00000000
--========================
SQL> commit;

提交完成。

SQL> alter system dump datafile 1 block 32962;

系统已更改。
--==========================
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000c.004.0000099e 0x01c0001d.198e.21 --U- 1 fsc 0x0000.018ed530
0x02 0x000f.024.00000997 0x01c000e7.18ef.3c ---- 1 fsc 0x0000.00000000
--===========================
--这里有个疑问:事务提交之后为什么第一个itl中的flag标记是U(第三位)而不是C(第一位)?
SQL> insert into t select object_id from dba_objects;

已创建11315行。
SQL> select xidusn,xidslot,ubafil,ubarec,ubablk,start_ubablk,start_ubarec from v
$transaction;

XIDUSN XIDSLOT UBAFIL UBAREC UBABLK START_UBABLK START_UBAREC
---------- ---------- ---------- ---------- ---------- ------------ ------------
12 1 7 19 17 29 34
15 36 7 60 231 231 60
SQL> alter system dump datafile 7 block 17;

系统已更改。
--从下面的dump信息中Rec #0x13(10进制的19,上面查出来的ubarec)
没有发现被事务(insert into t select object_id from dba_objects)
所覆盖的itl。
--=================================
* Rec #0x13 slt: 0x01 objn: 11946(0x00002eaa) objd: 11946 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x12
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
op: C uba: 0x01c00011.198f.12
KDO Op code: QMD row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x00408263 hdba: 0x004080c1
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 lock: 0 nrow: 95

--=================================
接下来再来dump这个事务使用的undo chain的start_ubablk:
SQL> alter system dump datafile 7 block 29;

系统已更改。
--从下面的dump信息中Rec #0x22(10进制的34,上面查出来的start_ubarec)
我们发现了被事务(insert into t select object_id from dba_objects)
所覆盖的由事务(insert into t values(1);插入的第一条记录)所使用的itl:
0x01 0x000c.004.0000099e 0x01c0001d.198e.21 ---- 1 fsc 0x0000.00000000
--==============================
* Rec #0x22 slt: 0x01 objn: 11946(0x00002eaa) objd: 11946 tblspc: 0(0x00000000)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x01c0001d.198e.21 ctl max scn: 0x0000.018ecec6 prv tx scn: 0x0000.018eced6
txn start scn: scn: 0x0000.018ed54c logon user: 0
prev brb: 29360155 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x000c.004.0000099e uba: 0x01c0001d.198e.21
flg: C--- lkc: 0 scn: 0x0000.018ed530
KDO Op code: QMD row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x004080c2 hdba: 0x004080c1
itli: 1 ispac: 0 maxfr: 4863
tabn: 0 lock: 0 nrow: 255
--===============================
结论:itl在被覆盖之前放在了事务的undo chain(单向链表的尾)的start_ubablk中以备
之后构造consistent read而使用。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1019104/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366336