技术开发 频道

ORA-01555错误浅析(2)

  这时,我们重新访问该数据块:

SQL> alter system flush buffer_cache;

System altered.

SQL
> conn demo/demo
Connected.
SQL
> select * from t_multiver;

         A          B
---------- ----------
         1        115
        
2        222
        
3        222

SQL
> alter system dump datafile 5 block 50959;

System altered.

  再将数据块内容dump出来:

Block header dump:  0x0140c70f
Object id
on Block? Y
seg
/obj: 0xe46c  csc: 0x00.a482a4a3  itc: 2  flg: E  typ: 1 - DATA
     brn:
0  bdba: 0x140c709 ver: 0x01 opc: 0
     inc:
0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn
/Fsc
0x01   0x0012.02d.0000049c  0x02c00080.0192.0f  C---    0  scn 0x0000.a482a495
0x02   0x000f.01b.00000533  0x02c00054.01bb.0f  C---    0  scn 0x0000.a482a3c3

data_block_dump,data header at
0x7745664
===============
tsiz:
0x1f98
hsiz:
0x18
pbl:
0x07745664
bdba:
0x0140c70f
    
76543210
flag
=--------
ntab=1
nrow
=3
frre
=-1
fsbo
=0x18
fseo
=0x1f4a
avsp
=0x1f62
tosp
=0x1f62
0xe:pti[0]    nrow=3    offs=0
0x12:pri[0]    offs=0x1f5e
0x14:pri[1]    offs=0x1f4a
0x16:pri[2]    offs=0x1f54
block_row_dump:
tab
0, row 0, @0x1f5e
tl:
10 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  
1: [ 3]  c2 02 10
tab
0, row 1, @0x1f4a
tl:
10 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  
1: [ 3]  c2 03 17
tab
0, row 2, @0x1f54
tl:
10 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 04
col  
1: [ 3]  c2 03 17
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 50959 maxblk 50959

  这时,可以看到,前一事务的Itl条目中,Flag标志为已经被修改为C,即提交完毕,Commit SCN也被获得。锁也已经被清除,其锁Lck的数量也清0。相应的,各条记录的行锁对应Itl位也被清0。

  还是图解一下这个过程:
 

  数据块初始状态:

  第一个修改该数据块的事务提交后:
 

  第二个访问该数据块的事务(清除了相应锁信息):
 

  当然,如果事务进行的删除操作,或者事务回滚,又会有一些不同的情况。我会在另外一篇文章中详细的介绍一下延迟块清除这个东东。

0
相关文章