交易是資料庫一致性的基本單位。本文依 Oracle 官方文件與實務經驗,詳細拆解交易啟動條件、Undo 分配、提交/回滾觸發點、Commit 內部四階段動作與鎖釋放時機。
1. 交易何時開始?
第一條可執行 SQL(DML 或 DDL)隱式啟動交易。
2. 交易開始後 Oracle 做了什麼?
分配可用 Undo 表空間或回滾段,記錄回滾入口(新交易槽)。
3. 交易何時結束?
COMMIT 或 ROLLBACK(僅單字 ROLLBACK)。
- DDL 語句隱式提交(
CREATE/ALTER/DROP 等)。
- 使用者斷開連線(依
AUTOCOMMIT 設定自動提交)。
- 使用者程序異常終止(強制回滾)。
4. COMMIT 內部四階段動作
- 生成回滾資訊:在 SGA 回滾段緩衝區建立舊值快照。
- 生成 Redo 記錄:在 Redo Log Buffer 記錄資料塊與回滾塊變更。
- 寫入資料緩衝區:變更標記在 Dirty Buffer,由 DBWn 依 LRU 非同步寫入磁碟(Commit 前可能已落盤)。
Commit 瞬間:
- 回滾段標記提交、分配 SCN 並記錄。
- LGWR 將 Redo Log Buffer 同步寫入 線上重做日誌檔,並寫入 SCN(關鍵:LGWR 寫入完成前 Commit 不返回)。
- 釋放列級/表級鎖。
- 標記交易結束。
關鍵啟示
- Commit 耗時主要取決於 LGWR 寫入重做日誌延遲(I/O 子系統效能)。
- 長交易會佔用 Undo 空間、增加快照過舊風險、阻塞其他交易。
- DDL 隱式提交會中斷當前交易,謹慎在交易中穿插 DDL。
理解交易內部流程,有助於設計適當的交易邊界、優化 Commit 頻率、排查鎖爭用與一致性問題。