首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 鎖機制深度解析:TM/TX 鎖模式、阻塞場景、ITL/Bitmap 爭用與死鎖實戰

     編輯:Oracle 資料庫相關知識

核心鎖類型與相容性矩陣

表鎖 (TM) 模式對應 V$LOCK.LMODE 值:

LMODE名稱縮寫
2Row ShareRS / SS
3Row ExclusiveRX / SX
4ShareS
5Share Row ExclusiveSRX / SSX
6ExclusiveX

相容性 (✓=相容, ✗=互斥):

RSRXSSRXX
RS✓✓✓✓✗
RX✓✓✗✗✗
S✓✗✓✗✗
SRX✓✗✗✗✗
X✗✗✗✗✗

經典阻塞場景實測

1. 直接路徑載入

INSERT /*+ APPEND_VALUES */ ... → 表加 X 模式 (LMODE=6),阻塞所有其他 DML。

2. 主鍵/唯一鍵衝突

Session 1 INSERT (PK=1) 未提交 → Session 2 INSERT (PK=1) 等待 enq: TX - row lock contention (請求 LMODE=4)。Session 1 提交後 Session 2 報 ORA-00001。

3. UPDATE/DELETE 同列爭用

同列不同 Session 修改 → 後者等待 TX 模式 6,只阻塞同列,不同列可並行。

4. ITL 槽位耗盡

PCTFREE 0 INITRANS 1 導致區塊無法擴展 ITL → 第三個並發 UPDATE 等待 enq: TX - allocate ITL entry。解決:調大 INITRANS。

5. Bitmap 索引鎖定

Bitmap 索引鍵值變更會鎖定整個 Bitmap 區段,所有涉及相同鍵值的 DML 互斥(含 INSERT)。

RI (Referential Integrity) 鎖定行為

  • 子表 DML → 父表加 RS (LMODE=3) 共享鎖。
  • 父表修改被引用鍵值 → 子表加 RX (LMODE=3),若子表有引用列則報 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 鎖模式速查

操作TM 模式
INSERT /*+ APPEND */ / SQL*Loader APPENDX (6)
INSERT /*+ APPEND */ ... PARALLELS (4)
一般 INSERT/UPDATE/DELETE/SELECT FOR UPDATERX (3)
LOCK TABLE ... IN SHARE MODES (4)
LOCK TABLE ... IN EXCLUSIVE MODEX (6)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved