KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 71(0x47) flag: 0x2c lock: 0 ckix: 80 --slot表示更新数据的行序列值(rowno),用于定位具体的数据,与我们查询的一致
ncol: 4 nnew: 1 size: 5
col 3: [ 9] 50 52 4f 43 45 44 55 52 45 --与上面描述的一样,转换为字符为‘PROCEDURE’,与我们更新前数据一致
Rec #0x2 这条undo record中还记录了一个rci参数,表示undo chain,同一个事务中的多次修改,根据这个chain连接起来。
当前rci参数值为0x01,即指向该undo块中的第一个undo record,找到Rec #0x01 undo record后,检查发现确实是我们这个UPDATE语句中的被更新的另一条数据。
五、在SESSION A中继续进行更新操作,进一步研究
(1)更新两条数据,同时查询基本的事务信息和数据块信息
SQL> update undotest set object_type='VIEW' where object_type='PROCEDURE' and id in (11504,11505);
2 rows updated.
SQL> SELECT
2 dbms_rowid.rowid_object(rowid) object_id,
3 dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
4 dbms_rowid.rowid_block_number(rowid) BLOCKNO,
5 dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,id,object_name,object_type
6 FROM undotest WHERE id in (11504,11505);
OBJECT_ID REL_FNO BLOCKNO ROWNO ROWID ID OBJECT_NAME OBJECT_TYPE
---------- ---------- ---------- ---------- ------------------ ---------- -------------------- ---------------
73424 4 236 41 AAAR7QAAEAAAADsAAp 11504 DBMS_FEATURE_RMAN_BZ PROCEDURE
IP2
73424 4 236 42 AAAR7QAAEAAAADsAAq 11505 DBMS_FEATURE_RMAN_BA PROCEDURE
SIC
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx') start_scnw,
2 to_char(start_scnb,'xxxxxxxx') start_scnb, start_scnb+start_scnw*power(2,32) start_scn
3 from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
19 0 4 258 5 4 0 0 0
SQL> alter system flush buffer_cache;
System altered.
SQL> alter system dump datafile 4 block 195;
System altered.
SQL> alter system dump datafile 4 block 236;
System altered.
SQL> alter system dump undo header '_SYSSMU19$';
System altered.
SQL> alter system dump datafile 5 block 258;
System altered.
(2)分析数据块dump文件
可以看到,SESSION A事务中第一个update语句修改的数据块(datafile 4 block 195)没有任何改变
Block header dump: 0x010000c3
Object id on Block Y
seg/obj: 0x11ed0 csc: 0x00.f2e95 itc: 3 flg: E typ: 1 - DATA
brn: 1 bdba: 0x10000b8 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.000f2e95
0x02 0x0013.000.00000004 0x01400102.0001.02 ---- 2 fsc 0x000a.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x010000c3
data_block_dump,data header at 0x2b5f5d4e6a7c
.........省略trace 文件中后面的输出.............
事务中第二个update语句修改的数据块(4,236)上的事务信息与我们查询的一致,如下
Block head