commit_write引數

victorymoshui發表於2012-10-30

Oracle 10gR2中引人了一個新的引數commit_write, 可以通過調整此引數調整Oracle在Commit時的行為特徵.

隨著web 2.0網站的湧現, 寫越來越成為傳統的RDBMS資料庫的瓶頸, 而lgwr的寫一直是Oracle資料庫中最終的瓶頸所在, 在早期的版本中, 所有的事務必須先申請redo log buffer的空間才能進行變更, 提交變更時也必須確保底層的IO寫到物理磁碟, 除非使用磁碟或者儲存的Write Cache,否則寫密集的應用會遭遇大量的log file sync, 使用者端在提交Commit命令之後必須等待lgwr程式寫好此事務相關的redo日誌才能返回, 以達到滿足ACID標準的Durability的目的. 或許是為了吸引部分此類使用者使用Oracle資料庫來解決此類問題, Oracle改進了lgwr Commit相關的處理, 以弱化Durability的方式來幫助使用者提高寫的效率.




關於oracle 的commit write引數,在10gR2的官方文件中可以看到介紹:

COMMIT_WRITE

Property Description
Parameter type String
Syntax COMMIT_WRITE = '{IMMEDIATE | BATCH},{WAIT |NOWAIT}'
Default value If this parameter is not explicitly specified, then database commit behavior. defaults to writing commit records to disk before control is returned to the client.

If only IMMEDIATE or BATCH is specified, but not WAIT or NOWAIT, then WAIT mode is assumed.

If only WAIT or NOWAIT is specified, but not IMMEDIATE or BATCH, then IMMEDIATE mode is assumed

Modifiable Yes (at both session-level and system-level). Values supplied for COMMIT_WRITE in an ALTER SYSTEM or ALTER SESSION statement must be separated by a comma.
Range of values Single-quoted, comma-separated list of either IMMEDIATE or BATCH, and either WAIT or NOWAIT.
Basic No
Real Application Clusters Each instance may have its own setting

COMMIT_WRITE is an advanced parameter used to control how redo for transaction commits is written to the redo logs. The IMMEDIATE and BATCH options control how redo is batched by Log Writer. The WAIT and NOWAIT options control when the redo for a commit is flushed to the redo logs.

Immediate
日誌資訊會立即寫入磁碟(每次提交時都必須做一次磁碟I/O操作)
batch
Oracle會對日誌資訊進行緩衝. Oracle會按照其自己安排的時間將此日誌資訊寫入到磁碟.
也就是說,多個I/O操作將組成一個批次進行處理

wait
直到提交(commit)操作成功完成,commit命令才會返回
nowait
Oracle不會等待提交返回,而是直接將控制權返回給客戶端





可以看到在預設的情況下,commit_write引數是空

SQL> show parameter commit_write;

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
commit_write                         string


在預設情況下(為空),表示的其實可以理解為(immediate,wait)

但是對於像plsql 中,其預設的commit其實就是commit nowait。
所以設定為預設值時,對於其他的sql語句,提交(commit)時採用的是wait模式,而plsql是nowait。

但是對於設定為immdiate,wait模式後,也會將plsql的提交方式轉變為wait,所以對於commit_write引數使用設定值和使用預設值還是有所區別的。

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

相關文章