ORACLE DML鎖定機制

passion_of_data發表於2011-06-20

DML

1TX鎖(事務鎖)

Oracle中的鎖定過程如下:

   (1)找到想鎖定的那一行的地址。

   (2)到達那一行。

       (3)鎖定這一行(如果這一行已經鎖定,則等待鎖住它的事務結束,除非使用了NOWAIT選項)。

V$TRANSACTION,對應每個活動事務都包含一個條目。

V$SESSION,顯示已經登入的會話。

V$LOCK,對應持有所有enqueue佇列鎖以及正在等待鎖的會話,都分別包含一個條目。這

並不是說,對於表中被會話鎖定的每一行,這個檢視中就有相應的一行。你不會看到這種情況。如前所述,不存在行級鎖的一個主列表。如果某個會話將EMP表中的一行鎖定,V$LOCK檢視中

就有對應這個會話的一行來指示這一事實。如果一個會話鎖定了EMP表中的數百萬行,V$LOCK檢視中對應這個會話還是隻有一行。這個檢視顯示了各個會話有哪些佇列鎖。

 

1、查詢特定使用者會話佇列資訊

selectusername,

v$lock.sid,

trunc(id1/power(2,16)) rbs,

bitand(id1,to_number('ffff','xxxx'))+0slot,

id2 seq,

lmode,

request

fromv$lock,v$session

wherev$lock.type='TX'

andv$lock.sid=v$session.sid

andv$session.username='WEIBIN';

(注:$LOCK表中的LMODE6REQUEST0。如果在OracleServerReference手冊中檢視V$LOCK

   表的定義,會發現LMODE=6是一個排他鎖。請求(REQUEST)值為0則意味著你沒有發出請求;

   也就是說,你擁有這個鎖。)

 selectXIDUSN,XIDSLOT,XIDSQN

fromv$transaction;

2、查詢哪個會話正阻塞了哪個會話

select(selectusernamefromv$sessionwheresid = a.sid) blocker,

      a.sid,

      'is blocking',

      (selectusernamefromv$sessionwheresid = b.sid) blockee,

      b.sid

 fromv$lock a, v$lock b

 wherea.block =1

  andb.request >0

  anda.id1 = b.id1

  anda.id2 = b.id2;

2TM(DML Enqueue)

TM鎖(TMlock)用於確保在修改表的內容時,表的結構不會改變。例如,如果你已經更新了一個表,

會得到這個表的一個TM鎖。這會防止另一個使用者在該表上執行DROPALTER命令。如果你有表的一個TM

鎖,而另一位使用者試圖在這個表上執行DDL,他就會得到以下錯誤訊息:

    droptabledept

                *

    ERRORat line1:

    ORA-00054:resourcebusyandacquirewithNOWAITspecified


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

相關文章