commit做了什麼?

edwardking888發表於2010-04-13

當完成事務操作,發出commit命令之後,隨後會收到一個反饋Commit complete

dbtan@NEI> insert into emp select * from emp;
128 rows created.
dbtan@NEI> commit;
Commit complete.

提交完成,這個提示意味著Oracle已經將此時間點之前的Redo寫入重做日誌檔案件,這個日誌寫完成之後,Oracle可以釋放使用者去執行其他任務。如果此後發生資料庫崩潰,那麼Oracle可以從重做日誌檔案中恢復這些提交過的資料,從而保證提交成功的資料不會丟失。

解釋:
為什麼COMMIT的響應時間相當“平”,而不論事務大小呢?
    在資料庫中執行COMMIT之前,困難的工作都已經做了。我們已經修改了資料庫中的資料,所以99.9%的工作都已經完成。例如,已經發生了以下操作:
    ·已經在SGA中生成了undo塊。
    ·已經在SGA中生成了已修改資料塊。
    ·已經在SGA中生成了對於前兩項的快取redo。
    ·取決於前三項的大小,以及這些工作花費的時間,前面的每個資料(或某些資料)可能已經重新整理輸出到磁碟。
    ·已經得到了所需的全部鎖。
執行COMMIT時,餘下的工作只是:
    ·為事務生成一個SCN。如果你還不熟悉SCN,起碼要知道,SCN是Oracle使用的一種簡單的計時機制,用於保證事務的順序,並支援失敗恢復。SCN還用於保證資料庫中的讀一致性和檢查點。可以把SCN看作一個鐘擺,每次有人COMMIT時,SCN都會增1.
    ·LGWR將所有餘下的快取重做日誌條目寫到磁碟,並把SCN記錄到線上重做日誌檔案中。這一步就是真正的COMMIT。如果出現了這一步,即已經提交。事務條目會從V$TRANSACTION中“刪除”,這說明我們已經提交。
    ·V$LOCK中記錄這我們的會話持有的鎖,這些鎖都將被釋放,而排隊等待這些鎖的每一個人都會被喚醒,可以繼續完成他們的工作。
    ·如果事務修改的某些塊還在緩衝區快取中,則會以一種快速的模式訪問並“清理”。塊清除(Block cleanout)是指清除儲存在資料庫塊首部的與鎖相關的資訊。實質上講,我們在清除塊上的事務資訊,這樣下一個訪問這個塊的人就不用再這麼做了。我們採用一種無需生成重做日誌資訊的方式來完成塊清除,這樣可以省去以後的大量工作。

那麼我們應該記住一個原則是:確保提交成功的資料不丟失。這個保證正是通過Redo來實現的。由此可以看到日誌檔案對於Oracle的重要,為了保證日誌檔案的安全,Oracle允許對重做日誌檔案進行映象。

從Oracle 10g開始,如果設定了閃回恢復區(Flash Recovery Area),則Oracle預設的就會對日誌檔案進行映象。映象的好處是當某個日誌出現問題,另外一個日誌仍然可用,可以保證資料不丟失,而且通常映象儲存於不同的硬碟,當某個儲存出現故障時,另外的儲存可以用於保證映象日誌的安全。

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

相關文章