oracle lock dba_ddl_locks獲取表級共享鎖及表級排它鎖之系列八

wisdomone1發表於2015-10-30

背景

  lock鎖不止有DML鎖,也有DDL鎖,之前已經學習了諸多鎖的知識與概念,現在我們學習DDL鎖,力圖更為全面瞭解ORACLE鎖的知識體系,如此運維過程中方可穩中有勝。


結論



1,透過dba_ddl_locks可以獲取ddl鎖的資訊

2,使用select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (174,332) and owner='SCOTT';
   查詢DDL鎖的佔用情況
   ,其包括資訊如:會話,資源的所有者,資源名稱,資源型別,持鎖模式,請求鎖模式

3,必須同時啟用2個建立或編譯引用相同表的儲存過程,才會產生對於引用表的表級共享鎖

4,alter table add持行級排它鎖
  alter table add default持表級排它鎖
  也就是說alter table不同選項的持鎖模大有差異
  在生產環境,建議更多采用alter table add default,當然最終在生產環境,也要結合你的實際需求




引發出的新問題

1,oracle lock機制還沒有完全搞通,搞懂,還要在實戰中繼續思考

2,oracle在不同版本鎖機制的演化,當然這個很高階了,慢慢來吧


測試



SQL> select * from v$version where rownum=1;


BANNER
---------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


SQL> show user
USER is "SCOTT"


SQL> alter session set current_schema=scott;


Session altered.


SQL> grant dba to scott;


Grant succeeded.


1,先看下DDL排它鎖


SQL> create table t_create(a int);


Table created.


可見create table不持任何鎖




SQL> alter table t_create add b int;


Table altered.


LOCK TABLE "T_CREATE" IN ROW EXCLUSIVE MODE  NOWAIT
可見alter table add持行級排它鎖




SQL> alter table t_create add b int default 0;


Table altered.


LOCK TABLE "T_CREATE" IN EXCLUSIVE MODE  NOWAIT 
可見alter table add default持表級排它鎖,可見alter table add如果選項不同,持鎖模式大有不同喲



2,再看下DDL共享鎖


建立儲存過程
SQL> create or replace procedure proc_t_create1
  2  as
  3  v_cnt pls_integer;
  4  begin
  5  select count(a) into v_cnt from t_create;
  6  end;
  7  /


Procedure created.




沒有持任何鎖




SQL> alter procedure proc_t_create1 compile;


Procedure altered.


沒有持任何鎖




轉換思路,向測試表插入大量資料
SQL> insert into t_create select level,level from dual connect by level<=1000000;


1000000 rows created.


SQL> commit;


Commit complete.


經過測試,仍未發現持任何鎖




再換一種思路,重讀官方手冊,發現是必須要2個會話以上建立或編譯引用相同基表的儲存過程,才會持表級共享鎖


新開一個會話,也建立另一個引用測試的儲存過程
SQL> select sid from v$mystat where rownum=1;


       SID
----------
       332


create or replace procedure proc_t_create2
as
v_cnt pls_integer;
begin
select count(a) into v_cnt from t_create;
end;
/




會產生332會話的對於引用表的表級共級鎖(而且這個持鎖時間極短,非常快)
SQL> select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (174,332) and owner='SCOTT';


SESSION_ID OWNER           NAME                 TYPE                           MODE_HELD          MODE_REQUESTED
---------- --------------- -------------------- ------------------------------ ------------------ ------------------
       332 SCOTT           PROC_T_CREATE2       Table/Procedure/Type           Exclusive          None
       332 SCOTT           T_CREATE             Table/Procedure/Type           Share              None
       332 SCOTT           T_CREATE             Table/Procedure/Type           Share              None
       332 SCOTT           SCOTT                18                             Null               None

個人簡介:


8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
   
   服務過的客戶:
          中國電信
          中國移動
          中國聯通
          中國電通
          國家電網
          四川達州商業銀行
          湖南老百姓大藥房
          山西省公安廳
          中國郵政
          北京302醫院     
          河北廊坊新奧集團公司
  
 專案經驗:
           中國電信3G專案AAA系統資料庫部署及最佳化
           中國聯通CRM資料庫效能最佳化
           中國移動10086電商平臺資料庫部署及最佳化
           湖南老百姓大藥房ERR資料庫sql最佳化專案
           四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及最佳化
           四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及最佳化
           北京高鐵訊號監控系統RAC資料庫部署及最佳化
           河南宇通客車資料庫效能最佳化
           中國電信電商平臺核心採購模組表模型設計及最佳化
           中國郵政儲蓄系統資料庫效能最佳化及sql最佳化
           北京302醫院資料庫遷移實施
           河北廊坊新奧data guard部署及最佳化
           山西公安廳身份證審計資料庫系統故障評估
         
 聯絡方式:
          手機:18201115468
          qq   :   305076427
          qq微博: wisdomone1
          新浪微博:wisdomone9
          qq群:275813900    
          itpub部落格名稱:wisdomone1    http://blog.itpub.net/9240380/









來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1819302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章