交易控制是資料庫一致性的基石。本文詳細拆解 Oracle 提交與回滾的內部處理步驟,釐清 SCN、LGWR、鎖釋放等關鍵機制,協助 DBA 理解交易邊界對系統行為的影響。
交易提交觸發條件
- 顯式發出
COMMIT 指令。
- 執行 DDL 指令(隱含提交)。
- 正常斷開連線(客戶端主動離開)。
COMMIT 內部處理序列 (關鍵路徑)
- 生成 SCN:服務進程為該交易分配唯一的 System Change Number (SCN),作為復原與一致性讀取的基準時間戳。SCN 記錄於控制檔、資料檔區塊頭、重做日誌中。
- LGWR 寫入重做日誌:Log Writer 進程將 Log Buffer 中該交易的重做記錄連同 SCN **同步寫入** 線上重做日誌檔(確保持久性)。此為 COMMIT 耗時的關鍵點。
- 釋放鎖資源:釋放該交易持有的所有列級鎖(TX)與表級鎖(TM),允許其他交易修改相關資料。
- 回應用戶端:向客戶端回傳「Commit Complete」訊息。
- 標記交易完成:在 Undo Segment Header 中將交易槽狀態標為 Committed,釋放 Undo 區塊供後續重用(視
UNDO_RETENTION 而定)。
ROLLBACK 內部處理序列
觸發條件:顯式 ROLLBACK、伺服器進程異常終止、DBA 強制終止 Session (ALTER SYSTEM KILL SESSION)。
- 撤銷資料變更:利用 Undo Segment 中的前像,將資料塊還原至交易開始前狀態。
- 釋放鎖資源:同 COMMIT,釋放所有 TX/TM 鎖。
- 標記交易結束:更新 Undo Header 狀態為 Rolled Back。
關鍵差異與效能啟示
| 面向 | COMMIT | ROLLBACK |
| 重做日誌 | LGWR 強制同步寫入 (耗時) | 產生補償性重做記錄,但通常較輕量 |
| Undo 處理 | 標記可重用,不立即清除 | 掃描 Undo 反向應用,CPU/IO 密集 |
| 鎖持有時間 | 至 LGWR 寫入完成 | 至 Undo 應用完成 (長交易回滾極久) |
實務建議
- 批次提交:大量 DML 作業分批次提交,避免單一巨大交易導致 Undo 膨脹、鎖爭用與漫長回滾風險。
- 監控 LGWR 等待:若
log file sync 等待偏高,檢查重做日誌多工配置、儲存裝置延遲。
- 避免長交易:長時間未提交的交易會阻礙 Undo 回收,導致
ORA-01555 Snapshot too old。
- 應用端設計:明確定義交易邊界,避免「會話結束自動提交」掩蓋邏輯錯誤。