熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle的事務與鎖與回滾段block的一點研究

2013-11-13 22:12:30  來源: Oracle 

  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: xccd      fsc x

   

  data_block_dump

   

  我們看到該塊上第一個 trans x  的一些標記信息

   

  scn: xe seq: x   scn號

  x   xid:  xbe    uba: xccd    (表示該事務更新條記錄)  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: xccd      fsc x

  x   xid:  xac    uba: xd      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


From:http://tw.wingwit.com/Article/program/Oracle/201311/18474.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.