事務包含多條語句,已執行語句的變更對同一事務內後續語句可見,但對其他事務不可見(直到 COMMIT)。隔離級別決定「其他事務的可見範圍」:
PL/SQL 引擎解析後逐條發送 SQL 給 Oracle,與 JDBC 多語句無本質差異。並發控制與恢復完全由 Oracle 核心處理,PL/SQL 不引入額外機制。
| 手段 | 效果 | 代價 |
|---|---|---|
| 縮短事務長度 | 減少鎖持有時間 | 業務邏輯重構難度大 |
| 固定存取順序 | 破壞循環等待條件 | 需全團隊遵守規範 |
| 降低隔離級別 | 減少鎖範圍與時間 | 可能出現幻讀/不可重複讀 |
| 索引優化 | 減少全表掃描鎖升級 | 需精準分析執行計劃 |
// Java 端同步控制範例
public void businessLogic() {
synchronized(lockObject) { // 或使用 ReentrantLock、Semaphore
// 1. 獲取所有資料庫操作所需邏輯鎖
// 2. 依序執行多條 SQL
// 3. 提交事務
}
// 鎖自動釋放
}
| 業務特徵 | 推薦隔離級別 | 理由 |
|---|---|---|
| 高並發、可容忍短暫不一致 | READ COMMITTED | Oracle預設,平衡並發與一致性 |
| 財務核算、庫存扣減 | SERIALIZABLE | 嚴格一致性,接受 ORA-08177 重試 |
| 報表統計、唯讀查詢 | READ ONLY | 零鎖開銷,快照隔離 |
| 應用層已實現同步 | READ COMMITTED | 僅倚賴資料庫原子性,降低鎖負擔 |
「沒有完美方案,只有權衡。死鎖是高並發系統的必然代價。現代架構傾向於:應用層處理業務邏輯同步,資料庫層僅提供原子性與持久化。但這要求團隊具備分散式系統設計能力。」