oracle commit隨筆記載

dotaddjj發表於2011-09-15

oracle中的commit經常使用,但是commit前後資料庫內部所做的事情還是很值得推敲的。網友又提到了一個dml語句,沒有commit會產生redo嗎,產生redo肯定是的,而且在commit之前已經產生了大量的redo

SQL> select name,value from v$mystat a,v$statname b where a.statistic#=b.statistic# and name='redo size';

NAME VALUE

---------------------------------------------------------------- ----------

redo size 1372

SQL> insert into test01 values(1,'pom');

1 row inserted

SQL> select name,value from v$mystat a,v$statname b where a.statistic#=b.statistic# and name='redo size';

NAME VALUE

---------------------------------------------------------------- ----------

redo size 1724

其實如果此時commit或者rollback都會產生redoRedo是記錄block變化的資訊的。

沒有執行commitdml時資料庫已經做了大部分工作,其實即使大事務的dml時,commit執行上也很平滑,commit之前很多工作已經完成了。

Dml時資料庫中:

1 修改sgabuffer cache,有資料塊的修改,可能同時有表段塊的修改和索引塊的修改。

2 sga中關於undo塊的生成,表的flashback都是利用undo tablespace中的前映象來實現的。

3 同樣redo log buffer產生了包含上述資料塊的變化的redo資訊。

4 buffer cache中可能有部門資料已經寫入到磁碟。

5 獲得需要的鎖。

剛開始誤解不commit的資料塊是不會寫入到磁碟的,commit時只是會觸發LGWR,把undo所在回滾段標記為已提交。

dml時會產生一個scn號,dbwr觸發會寫入到資料檔案頭部,commit時產生scn號,同樣寫入資料塊頭部。不過資料塊頭部只儲存了最新的scn號。

根據block的定義,block中儲存了事務插槽,事務期間都會佔用這個block的事務插槽,commit後事務結束,事務插槽可以被另外對此資料塊的事務使用。

Commit時資料庫內部:

1 事務生成scn

2 根據lgwr觸發條件,事務提交執行lgwrredo log buff寫入redo log,事務從v$transaction中移除。

3 清理塊頭, 儲存最後一個scn,事務插槽讓別的事務正常使用,釋放表頭部的行鎖(dbwn不是順序寫入,commit時並不馬上釋放塊頭的行鎖,實際相應的dbwn完成才會釋放。)

dml執行rollback

伺服器程式根據資料檔案塊和buffer cache塊的塊頭的事務列表和scn以及回滾段地址找到前映像來還原相應的資料塊。

如果在一個事務中執行多個dml語句,產生了多個前映像,此時rollback,透過查詢資料塊頭查詢回滾段地址,oracle只保留了最早的前映像。

Commit完成了instance crash

由於事務提交lgwr已經完成了所有事務的redo log,即使buffer cache沒有寫入磁碟,重啟例項後smon會根據redo log前滾資料檔案到事務commit結束時。

Commit完成中途,instance crash

1 Datafilelogfile同步

如果dml執行很長時間也沒有commit,此時log bufferbuffer cache已經寫入到磁碟,只是沒有commit來標誌事務的結束和把回滾段中前映像的標記為已提交,此時smon回滾資料檔案和日誌檔案最後一次事務提交時。

2 logfile中redo log新於datafile中,兩者不同步

此時logfile比datafile寫入的事務的資訊更多,本來也應該如此,dbwn發生前會優先發生lgwr,此時smon會優先把datafile前滾到logfile一致,然後回滾logfiledatafile到最後一次事務提交時。

就先整理這些吧,有些細節方面還需要後面更進一步的推敲。

精看細看文件,結合動手 思考練習,oracle就是沙漠和綠地不停的互動,不停的探討中!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章