表鎖 (TM) 模式對應 V$LOCK.LMODE 值:
| LMODE | 名稱 | 縮寫 |
|---|---|---|
| 2 | Row Share | RS / SS |
| 3 | Row Exclusive | RX / SX |
| 4 | Share | S |
| 5 | Share Row Exclusive | SRX / SSX |
| 6 | Exclusive | X |
相容性 (✓=相容, ✗=互斥):
| RS | RX | S | SRX | X | |
|---|---|---|---|---|---|
| RS | ✓ | ✓ | ✓ | ✓ | ✗ |
| RX | ✓ | ✓ | ✗ | ✗ | ✗ |
| S | ✓ | ✗ | ✓ | ✗ | ✗ |
| SRX | ✓ | ✗ | ✗ | ✗ | ✗ |
| X | ✗ | ✗ | ✗ | ✗ | ✗ |
INSERT /*+ APPEND_VALUES */ ... → 表加 X 模式 (LMODE=6),阻塞所有其他 DML。
Session 1 INSERT (PK=1) 未提交 → Session 2 INSERT (PK=1) 等待 enq: TX - row lock contention (請求 LMODE=4)。Session 1 提交後 Session 2 報 ORA-00001。
同列不同 Session 修改 → 後者等待 TX 模式 6,只阻塞同列,不同列可並行。
PCTFREE 0 INITRANS 1 導致區塊無法擴展 ITL → 第三個並發 UPDATE 等待 enq: TX - allocate ITL entry。解決:調大 INITRANS。
Bitmap 索引鍵值變更會鎖定整個 Bitmap 區段,所有涉及相同鍵值的 DML 互斥(含 INSERT)。
ORA-02292。ORA-02291。Session 1: UPDATE B SET X=3 WHERE X=1; -- 鎖 B
Session 2: UPDATE A SET X=3 WHERE X=1; -- 鎖 A
Session 1: UPDATE A SET X=5 WHERE X=1; -- 等待 A
Session 2: UPDATE B SET X=5 WHERE X=1; -- 等待 B → ORA-00060 Deadlock
Oracle 偵測到死鎖,犧牲偵測到的那條陳述式 (Session 1 的第二個 UPDATE),回滾該陳述式但保留事務;另一 Session 繼續等待直到第一個事務結束。
| 操作 | TM 模式 |
|---|---|
INSERT /*+ APPEND */ / SQL*Loader APPEND | X (6) |
INSERT /*+ APPEND */ ... PARALLEL | S (4) |
一般 INSERT/UPDATE/DELETE/SELECT FOR UPDATE | RX (3) |
LOCK TABLE ... IN SHARE MODE | S (4) |
LOCK TABLE ... IN EXCLUSIVE MODE | X (6) |