Oracle DML流程

轉自:http://www.linuxidc.com/Linux/2012-02/52972.htm

Oracle中,一個Delete操作的流程
刪除(DELETE)
1.Oracle讀Block到Buffer Cache(如果該Block在Buffer中不存在)
2.在redo log buffer中記錄delete操作的細節
3.在相應回滾段段頭的事務表中創建一個undo條目
4.把將要刪除的記錄創建前鏡像,存放到Undo Block中
5.在Buffer Cache中的相應數據塊上刪除記錄,並且標記相應的數據塊爲Dirty

提交(COMMIT)
1.Oracle產生一個SCN
2.在回滾段事務表中標記該事務狀態爲commited
3.LGWR Flush Log Buffer到日誌文件
3.如果此時數據塊仍然在Buffer Cache中,那麼SCN將被記錄到Block Header上,這被稱爲快速提交(fast commit)
4.如果dirty block已經被寫回到磁盤,那麼下一個訪問這個block的進程將會自回滾段中獲取該事務的狀態,確認該事務被提交。然後這個進程獲得提交SCN並寫回到Block Header上。這被稱爲延遲塊清除(delayed block cleanout)。

Oracle中,一個Update操作的流程
1.用戶提交一個update語句
2.serverprocess檢查內存緩存
      i 如果沒有有效內存空間,啓動DBWR,將緩存中未寫入磁盤的髒數據塊寫入
      ii 如果有有效空間,從磁盤讀入數據
3.在緩存內更新數據
    i 申請一個回滾段入口,將舊數據寫入回滾段
    ii 加鎖更新數據
    iii 並同時將修改記錄在Redo log buffer 中
4.用戶提交一個Commit
   i SCN增加
   ii 將Redo log buffer 寫入Redo log file
   iii 告訴用戶 Commit完成

Oracle中,一個Insert操作的流程
1.向DB BUFFER申請內存空間。
2.產生REDO.UNDO記錄(UNDO產生REDO信息),索引段REDO信息,在UNDO裏面記錄相關數據行號。
3.COMMIT
SCN增加
將Redo log buffer 寫入Redo log file
啓動DBWR,將緩存中的數據寫入磁盤的髒數據塊寫入
告訴用戶 Commit完成。

DELETE產生的UNDO信息是最多的(記錄所有相關字段的值)。
UPDATE產生的UNDO信息在中間的(記錄要更新的字段的值)。
INSERT 產生的UNDO信息是最少的(記錄要插入的記錄行號)。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章