程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫的DML命令的處理過程詳解

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

編輯:Oracle數據庫基礎

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命令的處理過程的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved