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

Oracle 交易管理核心機制:啟動、提交、回滾、隔離等級與讀一致性原理

     編輯:關於SqlServer

交易生命週期

交易啟動

遇到第一條可執行 SQL 陳述式 (DML: INSERT/UPDATE/DELETE/MERGE; DDL: CREATE/ALTER/DROP) 時隱式啟動。隱式交易無需 BEGIN。

交易結束 (四種方式)

  1. COMMIT:明確提交
  2. ROLLBACK:明確回滾
  3. 執行 DDL:若當前交易含 DML,Oracle 先自動 COMMIT,再執行 DDL (自動提交)
  4. 連線中斷:用戶主動斷開或進程異常終止 → 隱式 ROLLBACK

提交前後的內部作業

提交前 (SGA 內完成)

  • Undo (Rollback) Segment:產生前像記錄,供回滾與讀一致性
  • Redo Log Buffer:記錄資料塊變更向量 (含 Undo 區塊變更),可能提前寫入磁碟 (LGWR)
  • Database Buffer Cache:修改資料塊 (Dirty Buffer),可能提前寫入磁碟 (DBWn)

提交時 (關鍵路徑)

  1. 在 Undo Segment 交易表標記交易狀態為 COMMITTED,產生唯一 SCN (System Change Number)
  2. LGWR 強制將 Redo Log Buffer 寫入線上 Redo Log 檔案 (含 SCN) — 提交耗時核心
  3. 釋放所有 Row Locks / Table Locks
  4. 通知用戶程序提交完成
  5. 標記交易為完成,Undo 空間標記可重用

回滾時作業

  1. 掃描 Undo Segment 前像記錄,逆向還原所有資料塊修改
  2. 釋放所有鎖
  3. 通知用戶回滾成功
  4. 標記交易完成

交易隔離等級設定

-- 交易層級 (僅影響當前交易)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;   -- 預設
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
SET TRANSACTION READ WRITE;

-- Session 層級 (影響後續所有交易)
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
等級髒讀不可重複讀幻讀Oracle 實作
READ COMMITTED❌✅✅Statement-level 讀一致性 (預設)
SERIALIZABLE❌❌❌Transaction-level 讀一致性
READ ONLY❌❌❌僅查詢,SCN 固定於交易開始

讀一致性核心機制:SCN 驅動的多版本並發控制 (MVCC)

查詢 SCN 確定

  • READ COMMITTED:每個 SQL 陳述式執行時刻取得當前 SCN
  • SERIALIZABLE / READ ONLY:交易第一條 SQL 執行時刻取得 SCN,全交易共用

資料塊存取判斷邏輯

查詢 SCN = 10023
FOR 每個需求資料塊:
    IF 資料塊.SCN <= 10023:
        直接讀取 (版本足夠舊)
    ELSE:
        從 Undo Segment 取得該塊 SCN <= 10023 的前像版本
        (若 Undo 已被覆寫 → ORA-01555 Snapshot too old)
END

結果:查詢**只看見**在其 SCN 前已提交的修改;**不看見**未提交修改 (髒讀)、**不看見** SCN 後提交的修改 (不可重複讀/幻讀)。

私用回滾段指定

-- 指定當前交易使用特定回滾段
SET TRANSACTION USE ROLLBACK SEGMENT rbs_01;

適用場景:大量載入作業獨享大型回滾段,避免影響線上交易。

實務建議

  • 預設 READ COMMITTED** 滿足 95%+ 應用需求,效能最佳。
  • 報表/匯出類長跑查詢改用 SERIALIZABLE** 或 READ ONLY**,避免不可重複讀干擾業務邏輯。
  • 監控 V$TRANSACTION、V$ROLLSTAT 追蹤交易活躍度與 Undo 壓力。
  • 啟用 自動 UNDO 管理 (9i+)** 簡化運維,設定 UNDO_RETENTION 保障長查詢一致性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved