Oracle 事務隔離特性
Oracle 採用多版本並發控制(MVCC)實現事務隔離,核心表現為:
- 未提交不可见:一個未提交事務的修改,其他事務完全不可見。
- 讀一致性與快照:事務啟動時建立一致性快照,即便提交前已執行部分操作,後續查詢仍看不到自身未提交的變更(除非同一事務內)。
- 提交瞬間仍隔離:即便在提交的同一瞬間,其他並發事務也看不到該變更,必須等待提交完成後的新事務才可見。
語句級回滾
單一 SQL 執行期間發生錯誤(如約束違反、空間不足),Oracle 自動觸發語句級回滾,效果等同該語句從未執行。注意:解析階段的語法錯誤不產生回滾,因尚未產生任何資料變更。
事務控制的隱式分割規則
Oracle 無顯式 BEGIN TRANSACTION,採自動事務邊界:
- DML 與 DDL 混用時,DDL 前的 DML 自動提交成為獨立事務。
- 每個 DDL 單獨構成一個單語句事務,DDL 執行失敗不影響前序 DML 事務。
- DDL 無法回滾,這是設計時必須謹記的鐵律。
連線中斷與進程終止的不同後果
| 情境 | 典型案例 | 未提交事務命運 |
| 正常斷開連線 | SHUTDOWN IMMEDIATE、網路中斷 | 自動提交 |
| 進程被強制終止 | Kill -9、任務管理員結束進程 | 自動回滾 |
事務提交前的關鍵動作
- 在 Undo 表空間記錄「修改前影像」(Undo Log)
- 在 Redo Log Buffer 記錄「修改後影像」與 Redo/Undo 關聯
- 修改 SGA 中的資料塊(尚未寫入資料檔)
- 關鍵點:此時不一定觸發 DBWn 寫入磁碟;Redo 仍在記憶體中。
COMMIT 瞬間發生的四件事
- 生成 SCN(System Change Number)
- LGWR 將 Redo Log Buffer 強制寫入 線上 Redo Log 檔案(持久化)
- 釋放鎖與資源
- 標記事務為「已完成」
SAVEPOINT 部分回滾 vs 完整回滾
回滾至 Savepoint 會導致該時間點之後的所有 Savepoint 失效,但事務仍處於活躍狀態可繼續;完整回滾則結束整個事務。
自治事務
透過 PRAGMA AUTONOMOUS_TRANSACTION 宣告,允許在主事務中嵌套獨立子事務:
- 子事務與主事務完全隔離,不共享鎖、資源、未提交變更
- 子事務提交後,主事務可見其變更
- 常用於審計日誌、錯誤記錄等「必須落地」的場景