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

Oracle 資料庫鎖機制全解析:DML/DDL/內部鎖、阻塞與死鎖實戰

     編輯:Oracle 資料庫基礎

鎖是資料庫並發控制的核心。Oracle 採用多層次鎖架構,本文系統梳理鎖類型、相容性、阻塞判斷與處置實戰。

基礎概念

  • 排他鎖 (X Lock):寫操作持有,阻擋其他讀/寫
  • 共享鎖 (S Lock):讀操作持有,允許並發讀,阻擋寫
  • Oracle 以此兩類基礎鎖組合實現並發控制

三大鎖分類

DML 鎖機制深度解析

TM 鎖 (表級)

  • DML 執行時自動申請,模式:SS(Row Share)、SX(Row Exclusive)、S(Share)、X(Exclusive)
  • 對應 V$LOCK 中 TYPE='TM',模式碼 0-6
  • 目的:快速檢查表級相容性,避免逐行掃描 TX 鎖

TX 鎖 (行級/事務鎖)

  • 僅有 X 模式 (排他)
  • 事務首發 DML 時獲得,持有至 Commit/Rollback
  • 同一行並發 DML:先到者得鎖,後者等待 (enq: TX - row lock contention)

悲觀鎖 vs 樂觀鎖

類別保護對象主要鎖類型
DML 鎖 (Data Locks)資料完整性TM (Table/表級)、TX (Transaction/行級)
DDL 鎖 (Dictionary Locks)物件結構排他 DDL 鎖、共享 DDL 鎖、可剖析鎖
內部鎖與 Latch內部結構Latch、Mutex、Buffer Cache 鎖、Library Cache 鎖
維度悲觀鎖樂觀鎖
語法SELECT ... FOR UPDATE [NOWAIT]版本號/時間戳比對
鎖定時機查詢即鎖定更新時檢查
阻塞行為其他 DML 阻塞,DDL 報 ORA-00054無阻塞,衝突時回滾重試
適用場景高衝突、短事務低衝突、長事務、離線場景
Oracle 建議優先使用悲觀鎖,安全性更高。

阻塞 實戰判斷

四大產生阻塞的 DML

  • INSERT:主鍵衝突時等待
  • UPDATE / DELETE:目標行被鎖時等待
  • SELECT ... FOR UPDATE:主動加鎖

阻塞查詢腳本

-- 找出阻塞鏈
SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait,
       sql_id, blocking_sql_id
FROM v$session
WHERE blocking_session IS NOT NULL;

-- 詳細物件層級
SELECT s.sid, s.serial#, s.username, s.machine, s.program,
       o.object_name, l.locked_mode
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
  AND l.session_id = s.sid;

死鎖 處置

  • Oracle 自動偵測死鎖,犧牲者報 ORA-00060 並回滾陳述式 (非整個事務)
  • 應用層需捕獲異常並重試完整事務
  • 預防:固定存取順序、縮短事務、避免長事務中查詢未提交資料

效能視圖速查

  • V$LOCK:當前鎖持有/等待
  • V$SESSION_WAIT / V$SESSION:等待事件
  • V$LOCKED_OBJECT:被鎖物件
  • DBA_BLOCKERS / DBA_WAITERS:阻塞鏈 (舊版)

掌握鎖機制,才能從根源解決並發效能與死鎖難題。

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