理解V$LOCK.ID1和ID2欄位的含義
第一段理解:
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
- The information here contains the view description from the Oracle9i documentation along with any additional Useful Join Columns:
SID - Join to <> . SID
Support Notes:
The meaning of ID1 and ID2 depend on the lock TYPE.
---------------------------------------------------------------------------
Most Common Lock Types:
---------------------------------------------------------------------------
TYPE Name ID1 ID2 ~~~~ ~~~~ ~~~ ~~~ TX Transaction Decimal RBS & slot Decimal WRAP number (0xRRRRSSSS RRRR = RBS number, SSSS = slot ) A TX lock is requested in eXclusive mode if we are waiting on a ROW. A SHARE mode request implies we are waiting some other resource held by the TX (Eg: waiting for an ITL entry)
TM Table Locks Object id of table. Always 0. TS Temp Segment TS# Relative DBA ST Space Transaction Only ONE enqueue. UL User Locks --------------------------------------------------------------------------- Lock Conversion Summary --------------------------------------------------------------------------- Known Issues: Articles:
請注意METALINK文章中加紅的部分。參考的討論:http://www.itpub.net/thread-388459-1-1.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-715468/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- v$session中command欄位的含義解析Session
- ORACLE V$lock檢視TYPE,ID1,ID2取值的含義Oracle
- topas 中 PgSp 欄位的含義
- linux top命令欄位含義Linux
- [20171102]檢視v$session中process欄位含義Session
- 卡卡西:一文詳解explain各欄位含義AI
- 舉例解釋一下explain各欄位的含義AI
- ABAP 資料庫表 Size Category 欄位的準確含義資料庫Go
- iOS開發Xcode中的Info.plist欄位含義iOSXCode
- v$process和v$session中欄位解釋Session
- v$session command 的含義Session
- [20171120]理解v$session的state欄位Session
- 理解Express express.static 和 __direname 及 __firename的含義Express
- SAP ABAP 中,if_http_extension 介面的flow_rc 欄位含義HTTP
- oracle會話阻塞查詢指令碼及對應欄位含義Oracle會話指令碼
- HTTP 請求頭部欄位中 connection - keep-alive 的含義HTTPKeep-Alive
- all_constraints 表欄位Constraint_type值含義AI
- v$session的blocking_session含義SessionBloC
- php二進位制安全的含義PHP
- 含LONG型別欄位的表無法MOVE型別
- Request 增加自定義欄位的方式
- Chrome Network 下邊欄中 Finish 的含義Chrome
- SMART原則的定義和含義
- V$ASM_DISK 檢視含義ASM
- OCM實驗-建立含特殊欄位型別的表型別
- v$session.PROCESS/V$process.SPID含義Session
- PhpCms自定義欄位的使用說明PHP
- C++中&和*的含義C++
- mysql 下的提示和含義MySql
- C++箴言:理解typename的兩個含義(轉)C++箴言
- [筆記]解析v$log/v$logfile中status列值的含義筆記
- async 函式的含義和用法函式
- Thunk 函式的含義和用法函式
- X$KCCDI部分欄位解析和DUMP資訊和V$DATABASE進行對應Database
- sql語句修改欄位型別和增加欄位SQL型別
- oracle刪除表欄位和oracle表增加欄位Oracle
- 理解VC++裡字串型別的真正含義 (轉)C++字串型別
- 如何理解 package.json 中的 proxy 欄位?PackageJSON