qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Oracle數據庫的DML命令的處理過程詳解

            Oracle數據庫的DML命令的處理過程是本文我們主要要介紹的內容,從Oracle 9i起,有兩種undo的管理方式:自動Undo管理(Automatic Undo Management,簡稱AUM)和手工Undo管理(Manual Undo Management,簡稱MUM)。Oracle 9i之前只能使用MUM,而且在MUM中,undo segment又叫做rollback segment。從Oracle 9i起,Oracle就建議使用AUM,而不應再使用MUM了。

            DML語句與undo

            當我們發出一條DML(比如update tab set col1='A' where col1='B')語句時,其執行過程可大致概括為以下幾步。

            1、在shared pool里進行解析,從而生成執行計劃。

            2、假設根據執行計劃,得出col1='B'的記錄存放在10號數據文件的54號數據塊里。

            3、服務器進程在buffer cache里找一個可用的undo數據塊,如果沒有發現,則到undo表空間里找一個可用的undo塊,并調入buffer cache。假設獲得的undo數據塊號為24號,位于11號undo數據文件里。

            4、將改變前的值,也就是A放入11號undo數據塊。

            5、由于undo數據塊發生了變化,于是產生重做記錄,假設重做記錄號為120。

            行號 事務id file# block# row column value

            120 T1 24 11 10 col1 A

            6、在buffer cache里找到54號數據塊。如果沒有發現,則從10號數據文件里調入。

            7、將改變后的值,也就是B放入54號數據塊。

            8、由于數據塊發生了變化,于是產生重做記錄,假設重做記錄號為121。

            行號 事務id file# block# row column value

            121 T1 10 54 10 col1 B

            9、控制權返回給用戶,如果在SQL*Plus里執行DML,則表現為光標返回。

            10、當用戶發出commit命令時,觸發LGWR進程,將120與121這兩個重做記錄寫入聯機日志文件,并將54號數據塊和11號undo數據塊頭部所記錄的事務狀態標記設置為已提交。然后控制權返回給用戶,如果在SQL*Plus里執行DML操作,則表現為光標返回。

            11、這個時候,54號數據塊以及11號undo塊并不一定被DBWn寫入數據文件。只有在臟數據塊的數量達到一定程度才會被寫入。

            事務只要被提交或回滾,那么該事務所使用的undo塊就可以被覆蓋。對于上面的例子來說,當第10步,用戶發出commit命令以后,11號undo塊里的數據就可以被其他事務所覆蓋。

            關于Oracle數據庫的DML命令的處理過程的相關知識就介紹到這里了,希望本次的介紹能夠對您有所收獲!

          posted on 2012-05-14 09:57 順其自然EVO 閱讀(184) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 玛曲县| 诸暨市| 凤凰县| 正宁县| 海淀区| 什邡市| 临邑县| 北京市| 永吉县| 闽侯县| 宜川县| 特克斯县| 梅州市| 襄汾县| 孙吴县| 沁阳市| 当阳市| 香格里拉县| 伊春市| 双辽市| 盐山县| 潞城市| 正蓝旗| 乐亭县| 永德县| 威海市| 北票市| 天津市| 沈丘县| 图木舒克市| 灵山县| 西乌珠穆沁旗| 武清区| 开封县| 九龙城区| 福安市| 儋州市| 梓潼县| 若尔盖县| 如东县| 郸城县|