首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 鎖機制完整解析:共享/排他鎖、DML/DDL/內部鎖、TM/TX 鎖模式、V$LOCK 診斷實戰

     編輯:Oracle 資料庫基礎

Oracle 鎖體系:從共享/排他到 TM/TX、DDL、內部鎖的多層次並發控制

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, MutexSGA 記憶體結構Buffer Cache, Library Cache, Redo Allocation

TM 鎖 (Table Lock) 五種模式

Oracle 內部用 0-6 數字表示,常見模式:

模式編號名稱縮寫相容性 (可共存)觸發 SQL
0None-所有-
1NullNL所有SELECT (舊版)
2Row ShareRS (SS)RS, RX, SSELECT FOR UPDATE, LOCK TABLE ... IN ROW SHARE MODE
3Row ExclusiveRX (SX)RS, RXINSERT/UPDATE/DELETE, LOCK TABLE ... IN ROW EXCLUSIVE MODE
4ShareSRS, SCREATE INDEX, LOCK TABLE ... IN SHARE MODE
5Share Row ExclusiveSRX (SSX)RSLOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE
6ExclusiveXNoneDROP TABLE, ALTER TABLE ... MOVE, LOCK TABLE ... IN EXCLUSIVE MODE

關鍵:DML 執行時先申請 TM 鎖 (通常 RX/RS),再申請 TX 行鎖。TM 鎖相容性檢查避免逐行檢查 TX,大幅提升效能。

TX 鎖 (Transaction/Row Lock)

  • 只有一種模式:**排他 (X/Mode 6)**
  • 事務首次 DML 時獲得,持有至 COMMIT/ROLLBACK
  • 行級鎖標記在資料區塊的 LOCK BYTE (LB) 中
  • 同一行並發 DML:首個事務得鎖,其餘等待 (FIFO)
  • SELECT 不需鎖,透過 Undo 實現一致性讀

V$LOCK 關鍵欄位解讀

欄位含義
SIDSession 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持有/等待秒數
BLOCK1=阻塞其他 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');

常見阻塞場景與解決

  1. 未提交的 DML:TX Mode 6 持有,其他 DML 等待 → 找到 Session 通知提交/回滾或 KILL
  2. DDL 與 DML 衝突:DDL 需 TM Mode 6 (X),DML 持有 TM Mode 3 (RX) → 等待 DML 結束
  3. 索引建立阻塞:CREATE INDEX 需 TM Mode 4 (S),大表耗時長 → 使用 ONLINE 選項
  4. 外鍵無索引:刪除父表行需鎖定子表全表掃描 → 為 FK 欄位建立索引

鎖模式相容性矩陣 (TM Lock)

       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 衝突。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved