關於oracle commit

pingley發表於2012-05-15
關於oracle commit 
在oracle10gR2 中引入了commit 的write 子句,使我們對資料庫的commit 操作的
控制能力提高了,同時也引入了對commit 語句理解的混亂,本文試圖拋磚引玉,儘量
說明白oracle commit。(環境為oracle 11g R2)
commit_wait 初始化引數
oracle 預設commit 方式是wait ,也就是說等待LGWR寫完redo 以後才向使用者返回提交
完成的資訊。我認為預設的方式在大多數情況下很好很簡單。雖然oracle 預設的提交
方式是wait ,但是commit_wait 是沒有預設值的。可以在系統級和會話級設定該引數。
該引數的作用是控制commit 的redo 資訊寫入redo logs 的方式。語法格式如下:
COMMIT_WAIT = { NOWAIT | WAIT | FORCE_WAIT }
nowait :該項是違反事務的ACID的,請慎用。可以在以下情況下考慮使用:
一、有大量的事務的redo  資訊需要寫入redo logs。
二、在例項崩潰的時候可以容忍部分資料的丟失。
三、等待LGWR 寫對運用程式來說是不可以忍受的。
wait:oracle 預設的commit 方式,不需要顯示指定。
force_wait:將會使用oracle 預設的提交方式。commit write wait;
commit_logging 引數
該引數沒有預設值,可以在系統級或者會話級修改該引數。語法格式:
COMMIT_LOGGING = { IMMEDIATE | BATCH }
immediate :commit 語句會透過訊息觸發LGWR,因此redo 資訊會立即的寫入到redo logs.
batch: 寫入到redo logs 的資訊會被buffer 起來。如果commit_wait 引數設定成force_wait 以後改變commit_logging 引數,force_wait 選項不再有效。以上都是在系統級或者會話級控制commit 方式的行為,也可以在事務級控制commit 的行為。語句如下:
commit;
commit write wait;
commit write nowait;
commit write batch;
commit write immediate;
預設的情況下:commit = commit write wait = commit write immediate = commit write immediate wait;
小結:也許你會覺得wait 與immediate ,nowait 與 batch 是重複的,我對此的理解是:
wait 與 nowait 控制什麼時候redo 資訊寫入到redo logs 。
immediate 與 batch 控制redo 資訊以怎樣的方式寫入到redo logs。
nowait 方式的時候,redo 資訊一放在redo buffer 就返回 Commit complete.然後以immediate 方式或者batch方式寫入到redo logs。wait 方式的時候,把redo 資訊放在redo buffer 以後需要等待LGWR寫入,寫入的方式可以是immediate 或者batch.nowait 的方式之所以有風險是因為,無法保證LGWR確實將redo 資訊寫入了redo logs ,不管用哪一種寫入方式。因為redo 資訊放置在redo buffer 以後不一定成功的寫入到redo logs,比如還沒有來得及寫入到redo logs 伺服器就掉電了等。nowait 可以提高事務的吞吐量,batch 可以降低IO 操作。但是伴隨的風險就是破壞了事務的ACID,即已經提交成功的事務,不一定持久化到redo logs.
pl/sql 在非分散式事務下預設的提交方式是batch nowait.
commit_write 初始化引數在 oracle 11g 中已經棄用了,故沒有討論。

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

相關文章