事務基礎概念
事務是並發控制的基本單位,由一組 SQL 語句組成的邏輯工作單元,具備 ACID 四大特性:
| 特性 | 英文 | 說明 |
| 原子性 | Atomicity | 全做或全不做,不可分割 |
| 一致性 | Consistency | 事務前後數據完整性約束保持一致 |
| 隔離性 | Isolation | 並發事務互不干擾 |
| 持久性 | Durability | 提交後變更永久保存 |
事務控制語句
-- 顯式事務控制
SET TRANSACTION READ WRITE; -- 或 READ ONLY
SAVEPOINT sp_before_update; -- 設置保存點
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 發現錯誤回滾到保存點
ROLLBACK TO sp_before_update;
-- 確認無誤提交
COMMIT;
SQL 標準隔離級別與現象
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 鎖策略 |
| READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 | 無共享鎖 |
| READ COMMITTED | ❌ 防止 | ✅ 可能 | ✅ 可能 | 讀取即釋放共享鎖 |
| REPEATABLE READ | ❌ 防止 | ❌ 防止 | ✅ 可能 | 持有共享鎖至事務結束 |
| SERIALIZABLE | ❌ 防止 | ❌ 防止 | ❌ 防止 | 範圍鎖/表鎖 |
三大並發異常現象
- 髒讀:事務 A 讀取事務 B 未提交的修改,B 回滾導致 A 數據無效
- 不可重複讀:事務 A 多次讀取同一行,事務 B 提交修改導致結果不一致
- 幻讀:事務 A 多次範圍查詢,事務 B 提交插入導致結果集行數變化
Oracle 實際支援的隔離級別
| 級別 | 標準對應 | 特點 | 適用場景 |
| READ COMMITTED | SQL92 標準 | 默認級別,語句級讀一致性,防髒讀 | 高併發 OLTP 系統 |
| SERIALIZABLE | SQL92 標準 | 事務級讀一致性,防三大異常,可能報 ORA-08177 | 報表、批量處理、需嚴格一致性 |
| READ ONLY | 非標準 | 僅查詢,事務級一致性,無 DML 操作 | 長時間報表查詢 |
關鍵差異:語句級 vs 事務級讀一致性
- READ COMMITTED:每條 SQL 執行時刻看到已提交數據,同一事務中兩次查詢結果可能不同
- SERIALIZABLE:事務開始時刻(SCN)凍結數據快照,全事務看到一致視圖
設置隔離級別
-- 當前事務級別
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
-- 會話級別(影響後續所有事務)
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
Oracle 鎖機制與事務交互
鎖類型
- DML 鎖(行鎖 TX):
INSERT/UPDATE/DELETE 自動獲取,排他鎖,阻塞其他寫操作
- DDL 鎖:結構變更獲取,排他表鎖
- 系統鎖:Latch、Mutex 保護內存結構
事務與鎖的關係
- 事務開始隱式獲取 TX 鎖(
SET TRANSACTION 或首條 DML)
- 行鎖持有至
COMMIT/ROLLBACK,不隨語句結束釋放
SELECT ... FOR UPDATE 手動加排他鎖
- Oracle 讀不阻塞寫、寫不阻塞讀(多版本並發控制 MVCC)
死鎖檢測與處理
- Oracle 自動檢測死鎖,犧牲一方回滾(報 ORA-00060)
- 應用層預防:統一訪問表順序、縮短事務、避免長事務
- 監視視圖:
V$LOCK、V$SESSION_WAIT、DBA_BLOCKERS