Oracle鎖3:DDL鎖
當一個正在進行的DDL操作執行在或者引用了schema對象(注)時,Data dcictionary(DDL)鎖用於保護該schema對象的定義,在DDL操作執行期間僅鎖定單個schema對象,數據庫從不鎖定整個數據字典。
Oracle數據庫自動地請求DDL鎖,用戶不能顯示請求DDL鎖。例如,如果用戶創建一個存儲過程,那麼數據庫自動為存儲過程中引用的對象請求DDL鎖,這些DDL鎖防止存儲過程被編譯完成前這個對象被改變或者刪除。
排它DDL鎖
一個排它DDL鎖阻止其它session獲取DDL或DML鎖。大部分DDL操作,除了在“共享DDL鎖”中描述的,都會為資源要求排它DDL鎖,例如:當ALTER TABLE正在為表格增加一列時,DROP TABLE不允許被執行,反之亦然。
排它DDL鎖持續直到DDL操作執行完成並自動提交,在這期間,如果其它操作需要使用該schema對象,則需要等待直到老的DDL鎖被釋放。
共享DDL鎖
共享DDL鎖防止會破壞結構的沖突的DDL操作,但是允許類似的DDL操作並行執行。
例如,當一個CREATE PROCEDURE被執行時,事務會為所有的引用表要求共享DDL鎖,其它事務能並行地創建引用相同表的存儲過程並在相同的表上請求共享DDL鎖,但是沒有事務能請求一個排它DDL鎖在任何被引用的表上。
共享DDL鎖持續直到DDL操作執行完成並自動提交,因此,獲取一個共享DDL鎖的事務被保證事務執行期間schema對象保持不變。
可中斷解析鎖
SQL語句和PL/SQL塊中引用的每個schema對象都會使用一個解析鎖,因為如果一個引用對象被改變或者刪除,對應的共享SQL域(注)將失效。一個解析鎖被叫做可中斷解析鎖(breakable parse lock),因為它不阻止任何DDL操作並且為了允許沖突的DDL操作能被中斷。
一個解析鎖在解析SQL語句時被要求,如果語句的共享SQL域被保留在共享池中,鎖將被一直持有。
注:
schema是數據庫對象的名字集合;
schema對象是在一個schema中存儲的數據的邏輯結構;
共享SQL域(shared SQL area)指在共享池(shared pool)中為一個SQL語句保存的解析樹(parse tree)和執行計劃,一個語句只有一個共享SQL域存在。