首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 服務器進程處理用戶請求的完整流程解析:從 SQL 解析到提交回滾

     編輯:Oracle 資料庫基礎

概述

Oracle 服務器進程在處理用戶進程提交的 SQL 請求時,會依次完成七大核心任務:SQL 解析、數據塊讀入緩存、記錄 Redo 日志、建立回滾段、修改數據塊、標記髒數據塊、處理提交或回滾。本文將逐一拆解各環節的內部機制。

0. SQL 語句解析

用戶提交 SQL(如 UPDATE temp SET a=a*2)後,服務器進程在 PGA 分配會話內存,將 SQL 文本轉為 ASCII 並經 Hash 函數生成 Hash 值,到 Shared Pool 的 Library Cache 查找:

  • 命中:直接使用已緩存的解析樹與執行計劃。
  • 未命中:在 CGA/UGA 進行語法分析、語義檢查(數據字典驗證對象存在性、權限)、優化器生成執行計劃(基於統計信息或 Stored Outline),最終生成編譯代碼並緩存至 Library Cache(需獲取 Shared Pool Latch、Library Cache Latch/Pin)。

1. 數據塊讀入 DB Buffer Cache

服務器進程先檢查所需塊是否在 Buffer Cache(LRU 列表):

  • 命中:直接訪問,更新 LRU 計數器。
  • 未命中:需從數據文件讀取。先獲取表級 TM 鎖(防 DDL),再獲取行級 TX 鎖,掃描 LRU 列表尋找空閒塊(過程中將遇到的髒塊登記到 Dirty List,由 DBWn 異步寫出),將數據塊讀入 Buffer Cache 並掛至 LRU 列表頭部(需獲取 Buffer Cache Latch)。

2. 記錄 Redo 日志

數據讀入後,服務器進程將修改前的舊值、新值、RowID、SCN 等信息寫入 PGA 中的 Redo Log Buffer(需獲取 Redo Log Buffer Latch)。觸發 LGWR 寫入磁盤 Redo Log File 的條件:Buffer 達 1/3、累積 1MB、超過 3 秒、Checkpoint 發生、或 DBWn 寫入前。Redo Log File 循環使用,歸檔模式下 ARCn 處理歸檔。

3. 為事務建立回滾段

修改數據塊頭部事務列表並寫入 SCN,將塊頭副本(含 SCN)寫入 Undo Segment,形成「前映像」,用於後續回滾、恢復與一致性讀。Undo Segment 可存放於專用 Undo 表空間或其他表空間。

4. 本事務修改數據塊

在 Buffer Cache 中直接修改數據塊內容,並在塊頭記錄指向 Undo Segment 的地址。

5. 放入 Dirty List

若同一塊多次更新未提交,Undo 中會產生多個「前映像」(首個含 SCN,後續含 SCN 及指向前一映像的指針)。服務器進程在 Dirty List 建立指向該塊的指針,便於 DBWn 尋找寫入。當 Dirty Queue 長度達閾值(默認 25%)時通知 DBWn 刷盤。Oracle 支持多塊讀(db_file_multiblock_read_count)。

6. 用戶 COMMIT 或 ROLLBACK

COMMIT 機制

  • 觸發 LGWR 將 Redo Log Buffer 強制寫入 Redo Log File(不強制 DBWn 寫數據塊,即 No-Force-at-Commit)。
  • 事務狀態標記為已提交,行鎖(TX)在 DBWn 完成後釋放,可能導致其他會話等待已提交事務的資源。
  • 崩潰恢復:實例重啟時 SMON 根據 Redo Log 前滾已提交未寫入的數據;未提交事務則根據 Redo Log 回滾(實際以 Checkpoint 為基準)。

ROLLBACK 機制

服務器進程根據數據塊頭事務列表、SCN 及 Undo 地址,按「前映像」鏈逆向還原未提交修改。發出 COMMIT 後不可 ROLLBACK,保障了提交後 DBWn 尚未完成的後續寫入。

鎖機制補充

  • TM 鎖:保護對象定義,符合 Lock 機制。
  • TX 鎖:行級鎖,由數據塊頭、行頭字段表示,含 Resource/Lock Structure 與 Enqueue 算法。

結語

理解這七大步驟的協作關係,是掌握 Oracle 事務處理、性能調優與故障診斷的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved