天天看點

ORACLE關于鎖和V$LOCK的分析

  ORACLE關于鎖和V$LOCK的分析 

    為了實作并發,oracle資料庫使用了鎖機制。要了解鎖,首先要了解視圖v$lock。 v$lock這個視圖列出 Oracle 伺服器目前擁有的鎖以及未完成的鎖請求。如果你覺着 session 處于等待事件隊列當中,那你應該檢查視圖v$lock。

v$lock中的常用列有以下列:       sid:持有鎖的會話SID,通常與v$session關聯。

      type:鎖的類型,其中TM表示表鎖或DML鎖,TX表示行鎖或事務鎖,UL表示使用者鎖。我們主要關注TX和TM兩種型的鎖,其它均為系統鎖,會很快自動釋放,不用關注。當 Oracle執行 DML 語句時,系統自動在所要操作的表上申請 TM 類型的鎖。當 TM鎖獲得後,系統再自動申請 TX 類型的鎖,并将實際鎖定的資料行的鎖标志位進行置位。TM 鎖包括了SS 、 SX、 S 、X 等多種模式,在資料庫中用 0 -6 來表示。不同的 SQL 操作産生不同類型的 TM鎖。

      lmode:會話保持的鎖的模式。           0=None;           1=Null ;           2=Row-S (SS,行級共享鎖,其他 對象SQL語句隻能查詢這些資料行),sql操作有select for update、lock for update、lock row share;           3=Row-X (SX,行級排它鎖,在送出前不允許做DML操作),sql操作有 insert、update、delete、lock row share;           4=Share(共享鎖),sql操作有 create index、lock share;           5=S/Row-X (SSX,共享行級排它鎖),sql操作有lock share row exclusive; ??           6=Exclusive(排它鎖), alter table、drop table、drop index、truncate table、look exclusive等DDL       注釋:Row-S (SS,行級共享鎖)和Row-X (SX,行級排它鎖)中的第一個S 表示表被共享,如果表不被共享,就談不上其下級的行級鎖是否被共享還是排他了。表級别為X,行級鎖就不被其他會話通路,是以也就沒XX或XS模式,隻有X模式。

      ID1,ID2:  ID1,ID2的取值含義根據type的取值而有所不同,對于TM 鎖ID1表示被鎖定表的object_id 可以和dba_objects視圖關聯取得具體表資訊,ID2 值為0 (即表示type=TM時,用不到ID2列,故将其置為零);對于TX 鎖ID1以十進制數值表示該事務所占用的復原段号和事務槽slot number号,其組形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER,ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數。實際上這兩個字段構成了事務在復原段中的位置。

當鎖産生時,以下圖為例說明v$lock:

ORACLE關于鎖和V$LOCK的分析

1、圖中存在兩個session分别是133和135,session135的BLOCK=1意味着該session擁有一個鎖,并阻塞了其他session的對該鎖的請求。該鎖的類型由TY定義,模式由LMODE字段定義; 2、session133的request=6說明該session正在等待一個lmode為6的鎖,而該鎖的擁有者正是session135。 3、對于TM鎖,ID1Z值就是加鎖的段對象,可以是表或者表分區,此時ID2一般為0;對于TX鎖,這兩個字段構成該事務在復原段中的位置。

對于死鎖的處理流程: 1,查找鎖: select ls.osuser os_user_name, ls.username user_name, ls.type lock_type, o.object_name object, decode(ls.lmode,1,null,2,'Row Share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive',null) lock_mode, o.owner, ls.sid, ls.serial# serial_num, ls.id1,ls.id2, ls.paddr  from sys.dba_objects o, (select s.osuser,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial#,l.id1,l.id2  from v$session s,v$lock l where s.sid=l.sid) ls where o.object_id=ls.id1 and o.owner<>'SYS' order by o.owner,o.object_name 2,查找spid select a.spid,a.username,b.program  from v$process a,v$session b where a.addr=b.paddr and a.addr='000007FF2DC8E578'; 3、kill程序 alter system kill session 'sid,serial#' immediate; orakill sid spid sid:表示要殺死的程序屬于的執行個體名 thread:是要殺掉的線程号,即第2步查詢出的spid。      參考: oracle v lock詳解 百度

oracle 鎖表 解鎖 百度

繼續閱讀