ITPub博客

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

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

原创 IT综合 作者:warehouse 时间:2009-03-19 21:57:50 0 删除 编辑
究竟是被保存在覆盖它的这个事务所使用的undo的chain的end block还是start block中这个例子中没有得到论证,改天再验证。这里先临时记录一下。[@more@]

session 1:
SQL> create table t1(id int) initrans 1;

表已创建。

SQL> insert into t1 values(1);

已创建 1 行。

SQL> select id,rowid from t1;

ID ROWID
---------- ------------------
1 AAAC49AABAAAIIaAAA

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

ID FNO BNO
---------- ---------- ----------
1 1 33306

SQL> commit;

提交完成。

SQL> alter system dump datafile 1 block 33306;

系统已更改。
--============================
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0010.017.00000983 0x01c0005c.18a8.42 --U- 1 fsc 0x0000.018e374f
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
--============================
--这里插入2开启的事务仅仅是为了占用一个(第二个)itl,
不过为啥建表时制定的itl是1,可从dump的结果来看itl却是2个
SQL> insert into t1 values(2);

已创建 1 行。

SQL>
--================================
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0010.017.00000983 0x01c0005c.18a8.42 --U- 1 fsc 0x0000.018e374f
0x02 0x000b.024.00000993 0x01c0000b.196d.01 ---- 1 fsc 0x0000.00000000
--================================
session 2:
SQL> variable i refcursor;
SQL> exec open :i for select * from t1;

PL/SQL 过程已成功完成。

SQL>
session 3:
SQL> select * from t1;

ID
----------
1

SQL> update t1 set id=3;

已更新 1 行。

SQL> select id , rowid from t1;

ID ROWID
---------- ------------------
3 AAAC49AABAAAIIaAAA

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

ID FNO BNO
---------- ---------- ----------
3 1 33306

SQL> alter system dump datafile 1 block 33306;

系统已更改。
--==================================
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0011.01e.00000976 0x01c00022.180d.02 ---- 1 fsc 0x0000.00000000
0x02 0x000b.024.00000993 0x01c0000b.196d.01 ---- 1 fsc 0x0000.00000000
--==================================
--很显然itl:0x01已经被覆盖了。
那么此时在session 2中执行print i是结果咋样呢?
session 2:
PL/SQL 过程已成功完成。

SQL> print i;

ID
----------
1

SQL>
--结果又找到了,结果id:1是如何被从undo中构造出来的呢?
我们想session 2如果能输出id=1此时一定需要被session 3中事务
覆盖的itl,那么这个itl在被覆盖之前究竟被存在哪里呢?
在itl中存在uba,我们看看session 3中的事务使用的itl的uba:
SQL> select dbms_utility.data_block_address_file(to_number('01c00022','xxxxxxxx'
)) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(TO_NUMBER('01C00022','XXXXXXXX'))
----------------------------------------------------------------------
7

SQL> select dbms_utility.data_block_address_block(to_number('01c00022','xxxxxxxx
')) from dual;

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('01C00022','XXXXXXXX'))
-----------------------------------------------------------------------
34
SQL> alter system dump datafile 7 block 34;

系统已更改。
dump这个undo block看看是否在其中保存了session 2所需要的itl:
从dump的内容来看这个undo block中存在2个rec,其中session 3中的
事务使用的rec值是2(0x01c00022.180d.02)
--===============
* Rec #0x2 slt: 0x1e objn: 11837(0x00002e3d) objd: 11837 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: 0x01c00022.180d.01 ctl max scn: 0x0000.018e33db prv tx scn: 0x0000.018e33e3
txn start scn: scn: 0x0000.018e37e0 logon user: 0
prev brb: 29360240 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0010.017.00000983 uba: 0x01c0005c.18a8.42
flg: C--- lkc: 0 scn: 0x0000.018e374f
Array Update of 1 rows:
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 9
ncol: 1 nnew: 1 size: 0
KDO Op code: 21 row dependencies Disabled
xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x0040821a hdba: 0x00408219
itli: 1 ispac: 0 maxfr: 4863
vect = 0
col 0: [ 2] c1 02
--================
在这个rec 2中我们找到了session 2中需要的itl:
xid: 0x0010.017.00000983 uba: 0x01c0005c.18a8.42
flg: C--- lkc: 0 scn: 0x0000.018e374f
如果这个itl被覆盖的话那么在session 2中执行print i时就会报ora-01555错误,但是
此时在session 2中执行print i;oracle需要构造consistent get,
这个consistent get的过程暂时没有搞清楚。

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

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

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366336