SQL> create table a as select rownum a from t where rownum < ;
表已创建
SQL> alter table a initrans ;
表已更改
SQL> update a set a = where a in ();
已更新行
SQL> alter system dump datafile block ;
系统已更改
Start dump data blocks tsn: file#: minblk maxblk
buffer tsn: rdba: xc (/)
scn: xe seq: x flg: x tail: xe
frmt: x chkval: x type: x=trans data
Block header dump: xc
Object id on Block? Y
seg/obj: xbe csc: xe itc: flg: O typ: DATA
fsl: fnx: x ver: x
Itl Xid Uba Flag Lck Scn/Fsc
x xid: xbe uba: xccdc fsc x
data_block_dump
我们看到该块上第一个 trans x 的一些标记信息
scn: xe seq: x scn号
x xid: xbe uba: xccdc (表示该事务更新条记录) fsc x
下面是数据中的一些内容
block_row_dump:
tab row @xfb
tl: fb: HFL lb: x(x表示 该编号事务所更新数据) cc:
col : [ ] c
tab row @xfa
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xfa
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xfe
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xfc
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xfa
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xf
tl: fb: HFL lb: x cc:
然后我们继续在另外一个sqlplus中进行
SQL> update a set a = where a in ();
已更新行
SQL> alter system dump datafile block ;
系统已更改
SQL>
我们可以看到已经多了一个事务信息
Start dump data blocks tsn: file#: minblk maxblk
buffer tsn: rdba: xc (/)
scn: xe seq: x flg: x tail: xe
frmt: x chkval: x type: x=trans data
Block header dump: xc
Object id on Block? Y
seg/obj: xbe csc: xe itc: flg: O typ: DATA
fsl: fnx: x ver: x
Itl Xid Uba Flag Lck Scn/Fsc
x xid: xbe uba: xccdc fsc x
x xid: xac uba: xdf fsc x
data_block_dump
然后数据也发生了变化
block_row_dump:
tab row @xfa
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xc
tl: fb: HFL lb: x cc:
col : [ ]
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xcb
tl: fb: HFL lb: x cc:
col : [ ]
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xc
tl: fb: HFL lb: x cc:
col : [ ]
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xc
tl: fb: HFL lb: x cc:
col : [ ]
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c
tab row @xf
tl: fb: HFL lb: x cc:
col : [ ] c b
tab row @xf
tl: fb: HFL lb: x cc:
数据中的每行中都有标记 事务信息(编号)
这个时候我们查询x$bh
SQL> select dataobj# from obj$ where name = A;
DATAOBJ#
SQL> select count(*) from x$bh where obj = ;
COUNT(*)
我们看到这个时候 data buffer 中有个block
然后再在新的sqlplus中更新
SQL> update a set a = where a = ;
已更新 行
SQL>
这个时候我们发现
SQL> select count(*) from x$bh where obj = ;
COUNT(*)
SQL>
这说明一个问题
当更新的时候新增加了一个块这个块里面的数据就是 回滚段中保存的数据
也就是说同一个block在 data buffer 中存在多个版本的 before image