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

Oracle DDL 鎖機制詳解:排他、共享、可中斷解析鎖

     編輯:Oracle 教學

DDL 鎖定義

當 DDL 操作執行或引用 Schema 物件時,資料字典層面的鎖,保護物件定義不被並發變更。**僅鎖定單一物件,不鎖整個字典**。由資料庫自動請求,使用者無法顯式控制。

三類 DDL 鎖

1. 排他 DDL 鎖 (Exclusive DDL Lock)

  • 觸發操作:大多數 DDL:CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、CREATE INDEX 等。
  • 行為:阻塞其他 Session 獲取**任何 DDL 或 DML 鎖** (含排他/共享)。
  • 持續時間:DDL 執行完成並自動提交為止。
  • 範例:ALTER TABLE t ADD col 執行期間,另一 Session DROP TABLE t 將等待;反之亦然。

2. 共享 DDL 鎖 (Share DDL Lock)

  • 觸發操作:CREATE PROCEDURE/FUNCTION/PACKAGE/VIEW、COMPILE 等引用現有表的 DDL。
  • 行為:
    • 允許**同類操作並行** (多 Session 同時 CREATE PROCEDURE 引用同一表)。
    • 阻塞**衝突操作**:任何 Session 對被引用表請求排他 DDL 鎖 (如 ALTER TABLE、DROP TABLE) 將等待。
  • 持續時間:編譯/建立完成並自動提交為止。
  • 保證:持有期間 Schema 物件定義不變,編譯不會失敗。

3. 可中斷解析鎖 (Breakable Parse Lock)

  • 來源:SQL/PLSQL 解析階段,對引用物件加註冊鎖 (在 Library Cache 中)。
  • 目的:若引用物件被變更/刪除,對應共享 SQL 區失效,需重新解析。
  • 特性:**不阻塞任何 DDL**,允許衝突 DDL 執行並「中斷」此鎖 → 導致依賴游標失效 (下次執行重新解析)。
  • 生命週期:解析時建立,共享 SQL 區留在 Shared Pool 期間持續存在。

比較總結

鎖類型阻塞對象並行同類典型操作持有期
排他 DDL所有 DDL/DML否ALTER/DROP/TRUNCATE/CREATE INDEXDDL 完成提交
共享 DDL排他 DDL是CREATE PROCEDURE/VIEW/COMPILE編譯完成提交
解析鎖無 (可被中斷)是SQL/PLSQL 解析游標在 Shared Pool 存活期

相關概念釐清

  • Schema:資料庫物件名稱集合 (用戶 = Schema 擁有者)。
  • Schema 物件:表、視圖、索引、序列、程序、函數、套件、同義詞等邏輯結構。
  • 共享 SQL 區:Shared Pool 中儲存單一 SQL 解析樹與執行計畫,一條 SQL 只有一個共享 SQL 區。

實務啟示

  1. 大表 ALTER TABLE (加欄位、修改類型) 會持有排他 DDL 鎖,導致所有 DML 阻塞 → **維護窗口操作或使用 DBMS_REDEFINITION 線上重定義**。
  2. 頻繁 CREATE OR REPLACE PROCEDURE 釋放共享 DDL 鎖,但若同時有 ALTER TABLE 等待,會造成編譯排隊。
  3. 解析鎖中斷導致 ORA-04061/ORA-04065 (狀態失效),應用層需捕獲重試邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved