事務、鎖、完整性約束是 Oracle 並發控制與資料一致性的三大支柱。本文系統整理 ACID 特性、隔離級別、鎖類型、死鎖處理與約束最佳實踐。
事務結束:COMMIT (生效) / ROLLBACK (撤銷) / DDL 隱含提交 / Session 斷開隱含回滾。
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | Oracle 預設 |
|---|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 | 不支援 |
| READ COMMITTED | 不可能 | 可能 | 可能 | ✅ 預設 |
| REPEATABLE READ | 不可能 | 不可能 | 可能 | 不支援 (用串行化) |
| SERIALIZABLE | 不可能 | 不可能 | 不可能 | 需設定 |
Oracle 以多版本並發控制 (MVCC) 實現 Statement-Level Read Consistency (預設) 與 Transaction-Level Read Consistency (SET TRANSACTION ISOLATION LEVEL SERIALIZABLE)。
ROW SHARE (RS)、ROW EXCLUSIVE (RX)、SHARE (S)、SHARE ROW EXCLUSIVE (SRX)、EXCLUSIVE (X)。SELECT ... FOR UPDATE → RX;INSERT/UPDATE/DELETE → RX;LOCK TABLE ... EXCLUSIVE → X。
CREATE/DROP/ALTER TABLE,阻擋所有其他 DDL/DML。CREATE VIEW、編譯 PL/SQL,允許並發 DML、共享 DDL。Latch、Mutex、Buffer Pin 等保護 SGA 共享結構,使用者不可見。
Oracle 自動偵測死鎖 (ORA-00060),自動回滾其中一個事務 (Statement-Level Rollback)。
-- 1. 查封鎖鏈
SELECT * FROM v$lock WHERE block = 1;
-- 2. 關聯 Session
SELECT s.sid, s.serial#, s.username, s.machine, s.program, l.type, l.id1, l.id2
FROM v$lock l, v$session s
WHERE l.sid = s.sid AND l.block = 1;
-- 3. Kill Session
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- 4. OS 層強殺 (最後手段)
orakill SID spid -- Windows
kill -9 spid -- Linux
| 約束 | 用途 | 建議 |
|---|---|---|
| NOT NULL | 業務必填欄位 | 盡量在建表時宣告,避免應用層判斷 |
| UNIQUE | 業務唯一鍵 (如身分證號) | 建立唯一索引自動支援 |
| PRIMARY KEY | 實體識別 | 務必定義,關聯外鍵基礎 |
| FOREIGN KEY | 參考完整性 | **大量交易表慎用**,改由應用層或觸發器維護,減少鎖爭用 |
| CHECK | 域值範圍 | 簡單規則用,複雜規則改觸發器 |
理解 MVCC、鎖層級與約束權衡,是寫出高併發高可靠 Oracle 應用的關鍵。