通過10046分析v$lock持鎖模式lmode之系列四

wisdomone1發表於2015-10-27

背景

  在之前文章:
  http://blog.itpub.net/9240380/viewspace-1816522/
  學習了v$lock.lmode不同持鎖模式的基本區別,本文準備從實際操作角度來理解下不同持鎖模式的區別,便於大家從直觀感覺ORACLE 不同鎖模式的差異,
我們準備採用大家熟知的10046進行分析。  


結論



10046分析我們採用oredebug工具執行10046,因為ORADEBUG使用非常方便,關於如何在ORADEBUG中使用10046,請見測試之1,先看下SELECT查詢部分


1,所有結論基於10046
2,select查詢不加任何鎖
3,dml即insert,update,delete不加任何鎖
4,ddl之alter table add會對測試表新增行級排它鎖
5,ddl之truncate table會對測試表及sys使用者下的mon_mods$基本加表級排它鎖
6,ddl之drop table不加任何鎖
7,ddl之alter table modify會對測試表新增表級排它鎖
8,可見alter table move會對測試表新增表級排它鎖
9,可見收集表統計資訊沒有加鎖資訊
10,可見alter table validate structure會對測試表新增表級共享鎖






當然還有一些其它的各種DDL操作沒有測試,不過從這些測試中,有幾點體會
1,10046可以從底層檢視或分析對錶SELECT及DML及DDL持鎖情況
2, 有些DDL操作會自動產生lock table持鎖模式,而有些ddl卻不會
3, 如果在高併發的OLTP環境,在業務高峰期間嚴禁truncate table
   alter table modify
   alter table move 
4,進一步加深了對於持鎖模式v$lock.lmode的理解
5,再強調一點,10046是利器,還要要更多使用,發揮其作用
6,本文最大價值在於,感覺作ORACLE DBA一定要全面細心,具體一點就是同樣的命令,但採用不同的選項及引數,在高併發環境下產生的持鎖模式是不一樣,
  而不同的持鎖模式,會對併發操作造成不同的影響,所以一定要詳細測試,充分測試,理解不同選項的區別


測試



1,先看下select查詢
SQL> select * from v$version where rownum=1;


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


會話2
SQL> select  pid,spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));


       PID SPID
---------- ------------------------------------------------
       182 1095


SQL> create table t_everylock(a int,b int);


Table created.




SQL> insert into t_everylock values(1,1);


1 row created.


SQL> commit;


Commit complete.       


會話1
SQL> show user
USER is "SYS"
SQL> oradebug setospid 1095
Oracle pid: 182, Unix process pid: 1095, image: oracle@seconary (TNS V1-V3)
SQL> 


SQL> oradebug event 10046 trace name context forever,level 12
Statement processed.
SQL> oradebug unlimit
Statement processed.


會話2
SQL> select * from t_everylock;


         A          B
---------- ----------
         1          1


會話1
SQL> oradebug event 10046 trace name context  off
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_1095.trc




檢視select查詢生成的TRC檔案,未發現加鎖的資訊
PARSING IN CURSOR #4 len=25 dep=0 uid=84 oct=3 lid=84 tim=1446041227662326 hv=3732875905 ad='cf9b5688' sqlid='bj1a2kvg7yan1'
select * from t_everylock
END OF STMT


2,再看下insert插入
--略去無關內容
SQL> insert into t_everylock values(2,2);


insert插入生成的TRC檔案,沒有看到加鎖的資訊


3,再看下update更新


SQL> update t_everylock set a=2 where a=1;


1 row updated.


update生成的TRC檔案,沒有看到加鎖的資訊


4,繼續看delete
delete插入生成的TRC檔案,沒有看到加鎖的資訊


5,檢視select for update
select for update生成的TRC檔案,沒有看到加鎖的資訊


6,檢視truncate table


[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_28030.trc|grep -i --color "lock table"
LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE  NOWAIT 
lock table sys.mon_mods$ in exclusive mode nowait


truncate table期間會對測試表及sys使用者下的mon_mods$基本加表級排它鎖


7,檢視alter table add 
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_31544.trc|grep -i --color "lock table"
LOCK TABLE "T_EVERYLOCK" IN ROW EXCLUSIVE MODE  NOWAIT 
[oracle@seconary ~]$ 


可見alter table其間會對測試表新增行級排它鎖


8,檢視drop table
可見drop table期間未加任何鎖


9,檢視alter table modify(表中已有資料)
LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE  NOWAIT 
可見alter table modify會對測試表新增表級排它鎖


10,檢視dbms_stat.gather_table_stats
可見收集表統計資訊沒有加鎖資訊


11,檢視alter table move


LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE  NOWAIT 


可見alter table move會對測試表新增表級排它鎖


12,檢視analyze table validate structure
LOCK TABLE "T_EVERYLOCK" IN SHARE MODE  NOWAIT 


可見alter table validate structure會對測試表新增表級共享鎖



個人簡介:


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-1816849/,如需轉載,請註明出處,否則將追究法律責任。

相關文章