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

深度剖析 Oracle 事務機制:隔離、回滾、提交與自治事務

     編輯:Oracle 資料庫基礎

Oracle 事務隔離特性

Oracle 採用多版本並發控制(MVCC)實現事務隔離,核心表現為:

  1. 未提交不可见:一個未提交事務的修改,其他事務完全不可見。
  2. 讀一致性與快照:事務啟動時建立一致性快照,即便提交前已執行部分操作,後續查詢仍看不到自身未提交的變更(除非同一事務內)。
  3. 提交瞬間仍隔離:即便在提交的同一瞬間,其他並發事務也看不到該變更,必須等待提交完成後的新事務才可見。

語句級回滾

單一 SQL 執行期間發生錯誤(如約束違反、空間不足),Oracle 自動觸發語句級回滾,效果等同該語句從未執行。注意:解析階段的語法錯誤不產生回滾,因尚未產生任何資料變更。

事務控制的隱式分割規則

Oracle 無顯式 BEGIN TRANSACTION,採自動事務邊界:

  • DML 與 DDL 混用時,DDL 前的 DML 自動提交成為獨立事務。
  • 每個 DDL 單獨構成一個單語句事務,DDL 執行失敗不影響前序 DML 事務。
  • DDL 無法回滾,這是設計時必須謹記的鐵律。

連線中斷與進程終止的不同後果

情境典型案例未提交事務命運
正常斷開連線SHUTDOWN IMMEDIATE、網路中斷自動提交
進程被強制終止Kill -9、任務管理員結束進程自動回滾

事務提交前的關鍵動作

  1. 在 Undo 表空間記錄「修改前影像」(Undo Log)
  2. 在 Redo Log Buffer 記錄「修改後影像」與 Redo/Undo 關聯
  3. 修改 SGA 中的資料塊(尚未寫入資料檔)
  4. 關鍵點:此時不一定觸發 DBWn 寫入磁碟;Redo 仍在記憶體中。

COMMIT 瞬間發生的四件事

  1. 生成 SCN(System Change Number)
  2. LGWR 將 Redo Log Buffer 強制寫入 線上 Redo Log 檔案(持久化)
  3. 釋放鎖與資源
  4. 標記事務為「已完成」

SAVEPOINT 部分回滾 vs 完整回滾

回滾至 Savepoint 會導致該時間點之後的所有 Savepoint 失效,但事務仍處於活躍狀態可繼續;完整回滾則結束整個事務。

自治事務

透過 PRAGMA AUTONOMOUS_TRANSACTION 宣告,允許在主事務中嵌套獨立子事務:

  • 子事務與主事務完全隔離,不共享鎖、資源、未提交變更
  • 子事務提交後,主事務可見其變更
  • 常用於審計日誌、錯誤記錄等「必須落地」的場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved