非同步提交(Asynchronous COMMIT)

jackjw發表於2008-09-10

[@more@]


非同步提交(Asynchronous COMMIT)

Oracle 10g R2中引入的新特性

當一個事務提交時,the log writer (LGWR) process 負責將事務相關的所有重做從log buffer寫出到Online Redo logfiles.預設的,Oracle資料庫必須將重做寫入磁碟才把控制權交還給客戶端,這種行為導致在Commit的時候有一定的延時因為應用程式必須等待重做被寫入磁碟。

在Oracle10gR2中我們可以改變commit的預設行為來實現在commit之後,控制權立刻返回給使用者,而不是等待LGWR將重做寫入到online redo logfile.

在這樣的情況下,導致的潛在的風險是當例項Crash或是寫入online redo logfile失敗之後,那些被緩衝在redo log buffers中且還未被寫入到online redo logfile中的已經提交事務的redo可能會丟失,會導致那些已經提交的事務不能被恢復。

如何使用Asynchronous COMMIT
你可以在以下的兩個位置來改變Commit的預設行為:
1:在System or Session Level改變COMMIT_WRITE初始化引數
COMMIT_WRITE = '{IMMEDIATE | BATCH},{WAIT |NOWAIT}'

COMMIT_WRITE初始化引數選項可能的組合:
IMMEDIATE, WAIT
IMMEDIATE, NOWAIT
BATCH, WAIT
BATCH, NOWAIT

IMMEDIATE選項確保在發出Commit命令之後redo被立即寫出,也就是說,發起一次I/O。
BATCH選項意味著redo首先被緩衝,並沒有發起I/O,LGWR在適當的時間發起I/O批次將redo寫入磁碟。
WAIT選項確保在redo沒有寫入Online redo logfile前不會將控制權返回,而必須等待。
NOWAIT選項指定發出Commit命令之後立即將控制權返回,而不用等待redo寫入磁碟。

當沒有任何選定指定時,預設是IMMEDIATE , WAIT,這同之前的資料庫版本是一樣的。
不能同時指定BATCH 和 IMMEDIATE,也不能同時指定WAIT 和 NOWAIT。
在初始化引數設定之後,不帶任何選項的Commit語句遵照初始化引數指定的選項。

eg:
ALTER SYSTEM SET COMMIT_WRITE = IMMEDIATE, WAIT
ALTER SESSION SET COMMIT_WRITE = IMMEDIATE, NOWAIT

2:COMMIT語句中
COMMIT [WRITE [IMMEDIATE | BATCH] [WAIT | NOWAIT] ]

eg:
COMMIT WRITE BATCH WAIT
COMMIT WRITE BATCH NOWAIT

Note:
Note: The options in the COMMIT statement override the current settings in the initialization parameter.

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

相關文章