update語句的執行步驟和其他DML語句的執行步驟是一樣的包含insert 、delete語句等,執行步驟如下:
一、如果數據和回滾數據不在數據庫高速緩存區中,則oracle服務器進程將把他們從數據文件中讀取到數據庫高速緩存區中。
二、oracle服務器進程在要修改的數據行上加鎖(行一級的鎖)
三、oracle服務器進程將數據的變化信息和回滾段所需要的信息都記錄在重做日志緩沖區中
四、oracle服務器進程將回滾所需的原始值和對數據所做的修改都寫入數據庫高速緩沖區。之后在數據庫高速緩存區中所有的這些數據塊都將被標記為臟緩沖區,因為此時內外存的數據是不一致的。
五、然后由DBWR后台進程負責將數據庫高速緩存區中的臟緩存區中的數據寫到數據文件中,實現內外存的數據一致。至於DBWR后台進程的執行時間點是有oracle系統的設置所決定的,包含在一下情況時觸發DBWR進程執行數據的寫入。
(1)緩沖區的數量超過了所設定的限額
(2)所設定的時間間隔已到
(3)當有進程需要高速緩存區,但是此時又沒有空閑的高速緩存區時。
(4)當校驗點發生時
(5)當某個表被刪除drop或者被截斷truncate時
(6)當某個表空間被設置為只讀狀態時
(7)當使用類似alter tablespace users begin backup的命令對表空間進行聯機備份時
(8)當某個臨時表空間被設置為只脫機狀態或正常狀態時
commit語句的執行順序:
一、服務器進程將提交的記錄連同產生的SCN碼一起寫到重做日志緩存區中
二、LGWR進程將把重做日志緩存區中一直到所提交的記錄的所有記錄連續的寫到重做日志文件中。在此之后,oracle服務器就可以保證即使在系統崩潰的情況下所有提交的數據也可以得到恢復
三、oracle通知用戶進程提交操作已經完成
四、服務器進程將修改數據庫高速緩存區中的相關數據的狀態並釋放資源和打開鎖(實際上就是修改數據庫高速緩存區中的臟緩存區)
此時這些數據可能並沒有寫入數據文件中,這些數據緩存區被標記為臟緩存區。高速緩存區中 的數據由DBWR進程寫入數據文件中。
LGWR進程在下列情況下將重做日志緩存區中的數據寫入重做日志文件:
(1)當某個事務被提交時
(2)當重做日志緩存區中的變化的記錄超過1M時
(3)當緩存區的容量超過1/3時
(4)在DBWR進程將數據庫高速緩存去中修改過的數據塊寫入數據文件之前
(5)每3秒鍾
注:從LGWR進程的觸發事件看,LGWR進程的執行一定在DBWR進程的執行之前,這樣才能保證數據恢復的完整性。