Oracle 事務包含多條 SQL 語句。語句層級視為序列執行:語句執行期間資料狀態凍結,執行結束才產生影響。若語句違反約束(如唯一鍵衝突),整個語句回滾。但事務層級尚未提交前,所有變更對其他事務不可見;事務回滾時,所有語句影響均消除。
PL/SQL 在獨立引擎執行,解析後逐條發送 SQL 給 Oracle,與 Java JDBC 多語句同樣本質。因此並發控制與恢復管理完全由 Oracle 核心處理,PL/SQL 本身不引入差異。
事務 A:鎖定資源 1 → 等待資源 2
事務 B:鎖定資源 2 → 等待資源 1
→ 循環等待,死鎖產生
Oracle 逐條解析語句並加鎖,無法全局統籌事務所需鎖資源。若能在事務開始時一次性聲明所有 SQL,理論上可避免死鎖,但會降低並發度(預先鎖定可能不會執行的資源)。
| 隔離級別 | 並發度 | 一致性 | 死鎖風險 | 適用場景 |
|---|---|---|---|---|
| READ UNCOMMITTED | 最高 | 最低 | 最低 | 統計報表、可容忍髒讀 |
| READ COMMITTED | 高 | 語句級一致 | 中 | Oracle預設,大多數OLTP |
| SERIALIZABLE | 低 | 事務級一致 | 高 | 嚴格財務核算 |
SELECT ... FOR UPDATE NOWAIT 避免長時間等待「事務概念不可或缺,因為業務邏輯包含非資料庫操作,且需要 ACID 整體性。死鎖是高並發系統的必然代價,解決之道在於架構層面的權衡:要么資料庫層承擔(高隔離級別),要么應用層承擔(自行同步),沒有銀彈。」