理解V$LOCK.ID1和ID2欄位的含義

尛樣兒發表於2012-02-01

第一段理解:
TM
For the lock type TM (table lock), column ID1 is the object_id (or the
  data_object_id) for that table (could be joined with DBA_OBJECTS).
TX
For a
  lock of type TX (transaction lock), TRUNC( ID1 / 65536 ) shows which
  rollback segment that is used for the transaction and ID1 -
  ( rollbacksegment# * 65536 ) shows which slot number in the transaction
  table that this sessions is using (or want to used).

第二段理解:
TM       
id1:被修改表的標識(object_id)
id2:0
TX
id1:以十進位制數值表示該事務所佔用的回滾段號與該事務在該回滾段的事務表(Transaction table)中所佔用的槽號(slot number,可理解為記錄號)。其組成形式為: 0xRRRRSSSS ( RRRR = RBS number, SSSS = slot )。
id2:以十進位制數值表示環繞(wrap)次數,即該槽(slot)被重用的次數。

第三段理解:
TX
TX的id1經過分解對應V$transaction 的 XIDUSN,XIDSLOT。
id2對應 XIDSQN。

        上面的三段理解實際是一個含義,TX鎖所在的ID實際是由回滾段號和槽號組成,可分解成V$TRANSACTION的XIDUSN和XIDSLOT欄位,ID1/65536就等於V$TRANSACTION.XIDUSN。ID2是事務對應的槽號所使用的次數,對應V$TRANSACTION.XIDSQN欄位。

下面透過多個會話事務向主鍵表插入重複值的例子討論ID1和ID2的含義:
1).表結構:
SQL> desc x1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 NAME                                               VARCHAR2(20)
其中ID是主鍵。

2).會話1:
SQL> insert into x1 values(5,'SB');

1 row created.

3).會話2:
SQL> insert into x1 values(5,'SBB');
由於插入了ID=5的重複值,執行被卡住。

4).會話3:
SQL> select sid,type,id1,id2,lmode,request,block from gv$lock where (id1,id2) =(
select id1,id2 from gv$lock where block=1);  2

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
       141 TX     196612       1240          6          0          1
        16 TX     196612       1240          0          4          0

SQL> select sid,blocking_instance,blocking_session from v$session where blocking_instance is not null;

       SID BLOCKING_INSTANCE BLOCKING_SESSION
---------- ----------------- ----------------
        16                 1              141


SQL> select sid,type,id1,id2,lmode,request,block from gv$lock where sid=141;

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
       141 AE        100          0          4          0          2(11gR2新出現的鎖)
       141 TX     196612       1240          6          0          1
       141 TM      74637          0          3          0          2

V$TRANSACTION檢視:
SQL> select xidusn,xidslot,xidsqn,xid from v$transaction ;

    XIDUSN    XIDSLOT     XIDSQN XID
---------- ---------- ---------- ----------------
        10          5        883 0A00050073030000
         3          4       1240 03000400D8040000

        從上面的執行可以觀察出以下幾點:
         1.會話141阻塞了會話16。
         2.TM表鎖的ID2始終等於0。
         3.會話16的REQUEST等於4,表明該會話在等待被TX鎖住的其他資源。
         4.會話141和會話16的ID1和ID2完全相同,這ID1和ID2表示的是BLOCK=1的事務的ID1和ID2。根據這個特性通常查詢一個會話或一個資料庫阻塞的鎖就可以執行以下的兩條SQL:
SELECT * FROM V$LOCK WHERE (ID1,ID2) IN(SELECT ID1,ID2 FROM V$LOCK WHERE SID=&SID);
SELECT * FROM V$LOCK WHERE (ID1,ID2) IN (SELECT ID1,ID2 FROM V$LOCK WHERE BLOCK=1);
         5.會話141的ID1=196612,196612/65536=3=V$TRANSACTION.XIDUSN,會話141的ID2=1240=V$TRANSACTION.XIDSQN。


METALINK文章:

VIEW: "V$LOCK" Reference Note [ID 29787.1]

  修改時間 12-JAN-2011     型別 REFERENCE     狀態 PUBLISHED  

"V$LOCK" Reference Note

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

相關文章