Oracle 採用多粒度鎖架構:共享鎖 (S/Share) 與 排他鎖 (X/Exclusive) 為基礎,衍生出 DML 鎖 (TM/TX)、DDL 鎖、內部鎖/閂鎖。本文系統整理鎖分類、TM 鎖五模式 (SS/SX/S/X/SSX)、TX 排他行鎖、V$LOCK 診斷欄位解讀、鎖相容性矩陣與常見阻塞場景。
| 分類 | 類型代碼 | 保護對象 | 典型場景 |
|---|---|---|---|
| DML 鎖 (Data) | TM (Table), TX (Transaction/Row) | 資料完整性與一致性 | INSERT/UPDATE/DELETE/SELECT FOR UPDATE |
| DDL 鎖 (Dictionary) | DL (找不到對應代碼) | 物件結構定義 | CREATE/ALTER/DROP TABLE, INDEX |
| 內部鎖/閂鎖 | Latch, Mutex | SGA 記憶體結構 | Buffer Cache, Library Cache, Redo Allocation |
Oracle 內部用 0-6 數字表示,常見模式:
| 模式編號 | 名稱 | 縮寫 | 相容性 (可共存) | 觸發 SQL |
|---|---|---|---|---|
| 0 | None | - | 所有 | - |
| 1 | Null | NL | 所有 | SELECT (舊版) |
| 2 | Row Share | RS (SS) | RS, RX, S | SELECT FOR UPDATE, LOCK TABLE ... IN ROW SHARE MODE |
| 3 | Row Exclusive | RX (SX) | RS, RX | INSERT/UPDATE/DELETE, LOCK TABLE ... IN ROW EXCLUSIVE MODE |
| 4 | Share | S | RS, S | CREATE INDEX, LOCK TABLE ... IN SHARE MODE |
| 5 | Share Row Exclusive | SRX (SSX) | RS | LOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE |
| 6 | Exclusive | X | None | DROP TABLE, ALTER TABLE ... MOVE, LOCK TABLE ... IN EXCLUSIVE MODE |
關鍵:DML 執行時先申請 TM 鎖 (通常 RX/RS),再申請 TX 行鎖。TM 鎖相容性檢查避免逐行檢查 TX,大幅提升效能。
LOCK BYTE (LB) 中SELECT 不需鎖,透過 Undo 實現一致性讀| 欄位 | 含義 |
|---|---|
| SID | Session ID,可 JOIN V$SESSION |
| TYPE | 鎖類型:TM, TX, RT, MR, UL 等 |
| ID1, ID2 | 鎖標識符:TM→ID1=Object_ID; TX→ID1=Undo Segment, ID2=Slot |
| LMODE | 持有鎖模式 (0-6),數字越大越強 |
| REQUEST | 請求鎖模式 (0=不請求),同 LMODE 編碼 |
| CTIME | 持有/等待秒數 |
| BLOCK | 1=阻塞其他 Session,0=不阻塞 |
-- 1. 找出阻塞鏈
SELECT
BLOCKING_SESSION, S.SID, S.SERIAL#, S.USERNAME, S.MACHINE, S.PROGRAM,
L.TYPE, L.LMODE, L.REQUEST, L.CTIME, L.BLOCK,
O.OBJECT_NAME
FROM V$SESSION S
JOIN V$LOCK L ON S.SID = L.SID
LEFT JOIN DBA_OBJECTS O ON L.ID1 = O.OBJECT_ID
WHERE L.BLOCK = 1 OR L.REQUEST > 0
ORDER BY BLOCKING_SESSION;
-- 2. TM 鎖模式轉換 (數字→名稱)
SELECT CASE LMODE
WHEN 0 THEN 'NONE' WHEN 1 THEN 'NULL' WHEN 2 THEN 'ROW SHARE (SS)'
WHEN 3 THEN 'ROW EXCLUSIVE (SX)' WHEN 4 THEN 'SHARE (S)'
WHEN 5 THEN 'SHARE ROW EXCLUSIVE (SSX)' WHEN 6 THEN 'EXCLUSIVE (X)'
ELSE TO_CHAR(LMODE) END AS LOCK_MODE
FROM V$LOCK WHERE TYPE = 'TM';
-- 3. 查詢特定表的鎖情況
SELECT * FROM V$LOCKED_OBJECT WHERE OBJECT_ID = (SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME = 'YOUR_TABLE');
CREATE INDEX 需 TM Mode 4 (S),大表耗時長 → 使用 ONLINE 選項
Requested →
Held NL RS RX S SRX X
NL Y Y Y Y Y Y
RS Y Y Y Y Y N
RX Y Y Y N N N
S Y Y N Y N N
SRX Y Y N N N N
X Y N N N N N
Y=相容, N=衝突。RX (Row Exclusive) 是最常見的 DML 鎖模式,彼此相容但與 S/SRX/X 衝突。