Oracle 交易 (Transaction) 與 ACID 特性、隔離等級、鎖機制完整解析
什麼是交易?
交易是作為單一邏輯工作單元執行的一組相關操作,要求 全部完成 (COMMIT) 或全部不完成 (ROLLBACK),以保證資料安全有效。
ACID 四大特性
| 特性 | 英文 | 說明 |
| 原子性 | Atomicity | 交易中所有資料修改,要麼全做,要麼全不做 |
| 一致性 | Consistency | 交易完成後,所有資料必須處於一致狀態 (滿足完整性約束) |
| 隔離性 | Isolation | 並發交易間互不干擾,透過鎖與 MVCC 實現 |
| 持久性 | Durability | COMMIT 後的修改永久生效,即便系統故障也不丟失 |
交易組成與分類
- 組成:一條或多條 DML,可選一條 DDL,以及一條 DCL (COMMIT/ROLLBACK)
- 顯式交易:需手動發出
COMMIT 才持久化
- 隱式交易:
SET AUTOCOMMIT ON (僅對當前連線) 或執行 DDL/DCL/正常離開客戶端時自動提交
三大讀取異常現象
- 髒讀:T1 修改未提交,T2 讀取;T1 回滾 → T2 讀到無效資料
- 不可重複讀:T1 讀取,T2 修改並提交,T1 再讀 → 結果不同
- 幻讀:T1 查詢範圍,T2 插入符合條件新列並提交,T1 再查 → 多出新列
SQL-92 隔離等級對照
| 隔離等級 | 髒讀 | 不可重複讀 | 幻讀 | Oracle 支援 |
| READ UNCOMMITTED | 允許 | 允許 | 允許 | 不支援 |
| READ COMMITTED | 禁止 | 允許 | 允許 | 預設支援 |
| REPEATABLE READ | 禁止 | 禁止 | 允許 | 不直接支援 (可用 SERIALIZABLE 替代) |
| SERIALIZABLE | 禁止 | 禁止 | 禁止 | 支援 |
Oracle 另提供 READ ONLY 隔離等級 (唯讀交易,保證語句級一致性)。
鎖機制
- 排它鎖 (X Lock):DML (INSERT/UPDATE/DELETE) 自動加於受影響列,阻擋其他交易讀寫 (SELECT FOR UPDATE 亦同)
- 共享鎖 (S Lock):單純
SELECT (預設) 不加鎖,Oracle 採用 多版本並發控制 (MVCC),讀不阻寫、寫不阻讀
樂觀鎖 vs 悲觀鎖 (應用層設計模式)
| 策略 | 假設 | 實作方式 | 適用場景 |
| 悲觀鎖 | 衝突機率高 | 讀取時即加鎖 (SELECT FOR UPDATE / 應用層鎖表) | 高併發寫入、不可容忍衝突 |
| 樂觀鎖 | 衝突機率低 | 版本號/時間戳欄位,UPDATE 時比對版本,失敗則重試 | 讀多寫少、長交易、離線場景 |