關於oracle commit
關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Git commitGitMIT
- oracle之commit控制OracleMIT
- 關於COMMIT和ROLLBACK語句的使用注意事項MIT
- 關於 oracle NULLOracleNull
- 關於oracle with as用法Oracle
- 關於ORACLE AUTOTRACEOracle
- MySQL:Innodb 關於Handler_commit每次DML增加2的原因MySqlMIT
- 4.1 關於 Oracle RestartOracleREST
- [轉]關於oracle with as用法Oracle
- 關於oracle時區Oracle
- 關於oracle autonomous transactionOracle
- 關於informix和oracleORMOracle
- Oracle的commit做了什麼?OracleMIT
- oracle commit隨筆記載OracleMIT筆記
- Oracle redo undo commit rollback剖析Oracle RedoMIT
- oracle關於分割槽相關操作Oracle
- 【Oracle】-【隱式commit】-正常與異常退出對commit的作用OracleMIT
- 1 關於 Oracle Data GuardOracle
- 4.2.1 關於配置Oracle RestartOracleREST
- 關於oracle的Spool命令Oracle
- 關於oracle的upsertOracle
- 關於oracle審計功能Oracle
- oracle 關於--控制檔案Oracle
- 關於Oracle Certificate ProfessionOracle
- 關於Oracle字元亂碼?Oracle字元
- 關於Oracle偽列rownumOracle
- 關於oracle中的undoOracle
- Oracle vs PostgreSQL Develop(29) - COMMIT in PLSQLOracleSQLdevMIT
- oracle-2中commit 詳解OracleMIT
- Oracle的非同步commit設定Oracle非同步MIT
- 關於對innodb_flush_log_at_trx_commit引數的一些理解MIT
- commit_write,commit_logging,commit_wait引數和oracle redo行為MITAIOracle Redo
- Git基於指定commit提交建立分支GitMIT
- 關於Oracle Database Vault介紹OracleDatabase
- 關於Oracle RAC後臺程式Oracle
- ORACLE關於NULL的總結OracleNull
- oracle 關於--密碼檔案Oracle密碼
- oracle 關於--引數檔案Oracle