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

Oracle COMMIT 與 ROLLBACK 處理流程深度解析

     編輯:Oracle 資料庫基礎

交易控制是資料庫一致性的基石。本文詳細拆解 Oracle 提交與回滾的內部處理步驟,釐清 SCN、LGWR、鎖釋放等關鍵機制,協助 DBA 理解交易邊界對系統行為的影響。

交易提交觸發條件

  • 顯式發出 COMMIT 指令。
  • 執行 DDL 指令(隱含提交)。
  • 正常斷開連線(客戶端主動離開)。

COMMIT 內部處理序列 (關鍵路徑)

  1. 生成 SCN:服務進程為該交易分配唯一的 System Change Number (SCN),作為復原與一致性讀取的基準時間戳。SCN 記錄於控制檔、資料檔區塊頭、重做日誌中。
  2. LGWR 寫入重做日誌:Log Writer 進程將 Log Buffer 中該交易的重做記錄連同 SCN **同步寫入** 線上重做日誌檔(確保持久性)。此為 COMMIT 耗時的關鍵點。
  3. 釋放鎖資源:釋放該交易持有的所有列級鎖(TX)與表級鎖(TM),允許其他交易修改相關資料。
  4. 回應用戶端:向客戶端回傳「Commit Complete」訊息。
  5. 標記交易完成:在 Undo Segment Header 中將交易槽狀態標為 Committed,釋放 Undo 區塊供後續重用(視 UNDO_RETENTION 而定)。

ROLLBACK 內部處理序列

觸發條件:顯式 ROLLBACK、伺服器進程異常終止、DBA 強制終止 Session (ALTER SYSTEM KILL SESSION)。

  1. 撤銷資料變更:利用 Undo Segment 中的前像,將資料塊還原至交易開始前狀態。
  2. 釋放鎖資源:同 COMMIT,釋放所有 TX/TM 鎖。
  3. 標記交易結束:更新 Undo Header 狀態為 Rolled Back。

關鍵差異與效能啟示

面向COMMITROLLBACK
重做日誌LGWR 強制同步寫入 (耗時)產生補償性重做記錄,但通常較輕量
Undo 處理標記可重用,不立即清除掃描 Undo 反向應用,CPU/IO 密集
鎖持有時間至 LGWR 寫入完成至 Undo 應用完成 (長交易回滾極久)

實務建議

  • 批次提交:大量 DML 作業分批次提交,避免單一巨大交易導致 Undo 膨脹、鎖爭用與漫長回滾風險。
  • 監控 LGWR 等待:若 log file sync 等待偏高,檢查重做日誌多工配置、儲存裝置延遲。
  • 避免長交易:長時間未提交的交易會阻礙 Undo 回收,導致 ORA-01555 Snapshot too old。
  • 應用端設計:明確定義交易邊界,避免「會話結束自動提交」掩蓋邏輯錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved