数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

oracle的事务与锁与回滚段block的一点研究


发布日期:2021年11月06日
 
oracle的事务与锁与回滚段block的一点研究

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

               

上一篇:技术专题总结:standby Database (二)

下一篇:Oracle10gR2 新视图:V$SESSION变化跟蹤