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

Oracle 鎖機制三大層級深度解析:內部級、DDL 級、DML 級封鎖原理與實戰

     編輯:Oracle 資料庫基礎

前言:三層封鎖體系構建並發控制堡壘

Oracle RDBMS 採用三級封鎖架構:內部級保護內存結構、DDL 級保護字典一致性、DML 級控制數據並發。本文深度解析各層機制、DML 三種封鎖模式 (Share/Exclusive/Share Update)、死鎖成因與預防鐵律。

一、 內部級封鎖 — 不可見的守護者

  • 保護對象:SGA 共享內存結構 (緩存鏈、共享池堆、Redo 分配區等)
  • 實現:閂鎖 — 無等待隊列、自旋-睡眠、微秒級持有
  • 用戶不可見、不可控、無死鎖檢測
  • 性能視圖:V$LATCH, V$LATCHHOLDER

二、 DDL 級封鎖 (字典/解析封鎖) — 元數據一致性基石

特點:由解析器自動管理,無需用戶干預,持有時間極短 (解析階段)。

三、 DML 級封鎖 — 業務並發控制核心

1. 三大封鎖方式

類型觸發場景模式保護目標
字典操作鎖CREATE/ALTER/DROP 對象Exclusive (X)單一時刻僅一個字典操作,防結構衝突
字典定義鎖DDL 執行期間Share (S)防止並發解析讀取到半修改字典
表定義鎖SQL 解析/優化引用表Share (S)防止被引用表結構在解析期間被修改

2. 共享模式表封鎖 (LOCK TABLE ... IN SHARE MODE)

LOCK TABLE emp, dept IN SHARE MODE [NOWAIT];
-- 效果:所有會話可查詢,不可 UPDATE/DELETE/INSERT
-- 釋放:COMMIT / ROLLBACK / LOGOFF / 進程終止
-- 用途:報表查詢期間凍結數據,防止「讀取中數據變化」

3. 排它模式表封鎖 (LOCK TABLE ... IN EXCLUSIVE MODE)

LOCK TABLE emp IN EXCLUSIVE MODE [NOWAIT];
-- 效果:持有者可查/改,其他會話僅可查,不可任何鎖/改
-- 隱式獲取:INSERT/UPDATE/DELETE 自動獲取行鎖+表級 RX (Mode 3)
-- 釋放條件同共享模式
-- 用途:多表關聯更新前預鎖,統一順序避免死鎖

4. 共享更新封鎖 — 行級鎖 (核心並發機制)

兩種獲取方式:

  1. 顯式:LOCK TABLE emp IN SHARE UPDATE MODE [NOWAIT] — 預鎖整表行級意向
  2. 隱式 (標準):SELECT ... FROM emp WHERE deptno=10 FOR UPDATE OF sal [NOWAIT] — 精確鎖定符合條件的行

行級鎖特性:

  • 永遠是 排它 (X) 模式 — 同一行同一時間僅一會話可更新
  • 其他會話:可查詢、可鎖其他行、不可更新被鎖行 (等待)
  • ITL 槽存儲鎖信息,無中央鎖表,無鎖升級
  • 釋放:COMMIT / LOGOFF / 進程終止 — ROLLBACK 不釋放行鎖 (直到事務真正結束)

四、 鎖兼容性矩陣 (簡化版)

方式關鍵字粒度兼容性典型用途
共享封鎖SHARE表級兼容 Share/Share Update一致性查詢 (凍結表數據)
排它封鎖EXCLUSIVE表級不兼容任何鎖大批量更新、避免死鎖預鎖多表
共享更新封鎖SHARE UPDATE行級兼容 Share/Share Update (不同行)高並發 OLTP 行級更新

五、 死鎖:成因、檢測、預防鐵律

經典死鎖場景

-- Session 1
UPDATE accounts SET bal=bal-100 WHERE id=1;  -- 鎖行 1
UPDATE accounts SET bal=bal+100 WHERE id=2;  -- 等待行 2

-- Session 2
UPDATE accounts SET bal=bal-50 WHERE id=2;   -- 鎖行 2
UPDATE accounts SET bal=bal+50 WHERE id=1;   -- 等待行 1 → 死鎖

Oracle 自動處理

  • 定期掃描等待圖,發現環路
  • 選擇 代價最小 (Undo 量最少/執行時間最短) 會話犧牲
  • 回滾其事務,釋放所有鎖,返回 ORA-00060
  • 其他會話繼續執行

預防四大鐵律

  1. 統一多表/多行操作順序 (如永遠按 ID 升序更新)
  2. UPDATE/DELETE 盡量使用 WHERE 主鍵/唯一索引,縮小鎖範圍
  3. 完成修改立即 COMMIT,縮短鎖持有時間
  4. 高併發期 禁用 DDL/大表維護,避免 Mode 6 阻塞

六、 總結

三級封鎖各司其職:內部級 (閂鎖) 守護內存、DDL 級 (字典鎖) 守護元數據、DML 級 (行/表鎖) 守護業務數據。DML 級中,**行級 Share Update (FOR UPDATE) 是並發 OLTP 的靈魂**,配合「統一順序、縮小範圍、快速提交」三原則,構建高併發低阻塞的事務處理體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
已持有 \ 申請Share (S)Exclusive (X)Share Update (SU)
Share (S)✅❌✅ (但 SU 持有者不可更新)
Exclusive (X)❌❌❌
Share Update (SU)✅❌✅ (不同行) / ❌ (同行更新時轉 X 等待)