基於v$lock.block及request及dba_waiters或dba_blockers學習lock鎖系列七

wisdomone1發表於2015-10-29

結論



1,v$lock.block=1表明為持鎖會話,而block=0,表示為被阻塞會話(當然前提是至少有2個會話,如果僅一個會話,block=0),也就是說至少要2個會話才有意義比較block的值
2,v$lock雖然可以透過block的值來區分持鎖會話或被阻塞會話,但並不直觀,並且不能建立持鎖會話與被阻塞會話的對應關係,當然,你可以對v$lock進行再加工,是可以滿足這個需求的
3,透過dba_waiters及dba_blockers可以顯示等待會話及持鎖會話的對應關係,非常直觀,是v$lock的有效補充
4,dba_blockers僅適用於單例項資料庫
5,基於v$lock,
    持鎖會話的條件是,request為none,block=1
    被阻塞會話的條件是,request為非none,block=0




測試



1,建立測試表並插入資料
SQL> select * from v$version where rownum=1;


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


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


Table created.


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


1 row created.


SQL> commit;


Commit complete.


會話1
SQL> select * from v$mystat where rownum=1;


       SID STATISTIC#      VALUE
---------- ---------- ----------
       234          0          0


SQL> update t_block set a=3 where a=1;


1 row updated.






會話2


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


       SID STATISTIC#      VALUE
---------- ---------- ----------
        55          0          0


SQL> delete from t_block where a=1;
hang住




監控會話  


---會話2 DELETE操作 HANG住,其BLOCK為0,而request為x,即它請求6級事務排它鎖,


SQL> l
  1  select sid,type,id1,id2,
  2         decode(lmode,0,'none',1,'null',2,'row-s',3,'row-x',4,'s',5,'ssx',6,'x') lmode,
  3         decode(request,0,'none',1,'null',2,'row-s',3,'row-x',4,'s',5,'ssx',6,'x') request,
  4         ctime,block
  5* from v$lock where  type in ('TM','TX') and sid in (234,55)
SQL> /


       SID TYPE        ID1        ID2 LMODE      REQUEST         CTIME      BLOCK
---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
        55 TX     19857420       3159 none       x                  24          0 --被阻塞會話55,其block=0,request=x
       234 TM        74772          0 row-x      none               93          0
        55 TM        74772          0 row-x      none               25          0
       234 TX     19857420       3159 x          none               93          1  --阻塞會話即持鎖會話234,其block=1,



但是從v$lock是可以查詢持鎖會話及等待鎖會話的資訊,但不直觀,可以透過dba_waiters進行檢視
SQL> select waiting_session,holding_session,lock_type,mode_held,mode_requested,lock_id1,lock_id2 from dba_waiters where waiting_session=55;


WAITING_SESSION HOLDING_SESSION LOCK_TYPE            MODE_HELD                 MODE_REQUESTED         LOCK_ID1   LOCK_ID2
--------------- --------------- -------------------- ------------------------- -------------------- ---------- ----------
             55             234 Transaction          Exclusive                 Exclusive              19857420       3159




或者透過dba_blockers也可以查詢持鎖會話的SID,但注意此字典適用於單例項資料庫
SQL> select holding_session from dba_blockers;


HOLDING_SESSION
---------------
            234


個人簡介:


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

相關文章