開啟3個session:
SQL> select sid from v$mystat where rownum=1;
SID ---------- 29
SQL>
SQL> select sid from v$mystat where rownum=1;
SID ---------- 35
SQL>
SQL> select sid from v$mystat where rownum=1;
SID ---------- 38
SQL>
使用sessionID為29進行更新t表操作 SQL> update t set name='qq' where id = 2;
1 row updated.
SQL> 查詢事務: select xidusn,xidslot,xidsqn,status from v$transaction; 5 30 1099 ACTIVE 說明當前存在一個活動的事務
下面是查詢sessionID為29的串連所產生的事務資訊: select sid,type,id1,id2, decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode, decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,block from v$lock where sid=29;
SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK 29 AE 100 0 Share None 0 29 TM 74585 0 Row Exclusive None 0//表級鎖 29 TX 327710 1099 Exclusive None 0//行級鎖 SID表示sessionID,TYPE表示鎖的類型,ID2表示事務槽被覆蓋的次數,ID1中的資訊包含兩種資訊:1.事務表 2.事務表中行 通過: 將ID1拆解 select trunc(327710/power(2,16)) as undo_blk#,bitand(327710,to_number('ffff','xxxx')) + 0 as slot# from dual;UNDO_BLK#, SLOT# 5 30//顯示的是該事務的資訊,這也說明了ID1表示了兩種資訊的說法。LOCK_MODE表示鎖的模式,REQUEST_MODE是否請求鎖,BLOCK表示鎖住哪個事務select OWNER,OBJECT_NAME,OBJECT_ID,OBJECT_TYPE,CREATED,LAST_DDL_TIME,STATUS,NAMESPACE from dba_objects where object_id=74585;//被鎖的對象 OWNER, OBJECT_NAME, OBJECT_ID, OBJECT_TYPE, CREATED, LAST_DDL_TIME, STATUS, NAMESPACE SYS T 74585 TABLE 22-12月-14 04-1月 -15 VALID 1 對於TM鎖來說,ID1表示被鎖定的對象的對象ID,ID2始終為0 對於TX鎖來說,ID1表示事務使用的復原段編號以及在事務表中對應的記錄編號,ID2表示該記錄編號被重用的次數(wrap) 使用sessionID為35進行更新t表操作:SQL> update t set name='ww' where id = 2; //沒有執行結果說明被鎖住了下面是查詢sessionID為29、35的串連所產生的事務資訊: select sid,type,id1,id2, decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode, decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,block from v$lock where sid in(29,35) order by sid; SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK29 TM 74585 0 Row Exclusive None 0 29 AE 100 0 Share None 0 29 TX 327710 1099 Exclusive None 1//鎖住了一個事務 35 TM 74585 0 Row Exclusive None 0 35 AE 100 0 Share None 0 35 TX 327710 1099 None Exclusive 0//請求一個獨佔鎖定,因為上面的29鎖住了 使用sessionID為38進行更新t表操作:SQL> update t set name='ww' where id = 2; //沒有執行結果說明被鎖住了 查詢v$enqueue_lock來獲得鎖定隊列中的session資訊: select sid,type, decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode from v$enqueue_lock where sid in(35,38); SID, TYPE, REQUEST_MODE35 AE None 38 AE None 35 TX Exclusive 38 TX Exclusive可以知道sessionID為35,38的串連需要鎖為X鎖 查詢幾個鎖之間的關係:select a.sid blocker_sid,a.serial#,a.username as blocker_username,b.type, decode(b.lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode, b.ctime as time_held,c.sid as waiter_sid, decode(c.request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode, c.ctime time_waited from v$lock b, v$enqueue_lock c, v$session a where a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = 'TX' and b.type = 'TX' and b.block = 1 order by time_held, time_waited; BLOCKER_SID, SERIAL#, BLOCKER_USERNAME, TYPE, LOCK_MODE, TIME_HELD, WAITER_SID, REQUEST_MODE, TIME_WAITED 29 557 SYS TX Exclusive 2452 38 Exclusive 274 29 557 SYS TX Exclusive 2452 35 Exclusive 712BLOCKER_SID:鎖的sessionID為29,BLOCKER_USERNAME:鎖的使用者名稱是sys,TYPE:鎖的類型為TX(行級鎖)LOCK_MODE:鎖的模型為獨佔鎖定,TIME_HELD:鎖所持續的時間WAITER_SID:該鎖被哪個sessionID鎖等待,REQUEST_MODE:請求鎖的類型,TIME_WAITED:請求時間通過上面的資訊就可以知道某個串連所持有的鎖時間,假如時間過長說明該串連存在問題,就可以殺掉該串連alter system kill session '29,557';//第一個參數BLOCKER_SID,第二個為SERIAL#參數 一個事務修改多行,產生一個TX鎖 select sid from v$mystat where rownum=1; SQL> update t set name='rr' where id=2;
1 row updated.
SQL> update t set name='rr' where id=2;
1 row updated.
SQL> update t set name='rr' where id=2;
1 row updated.
SQL>
select sid,type,id1,id2, decode(lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode, decode(request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive')request_mode,block from v$lock where sid=38;
SID, TYPE, ID1, ID2, LOCK_MODE, REQUEST_MODE, BLOCK38 AE 100 0 Share None 0 38 TM 74585 0 Row Exclusive None 0 38 TX 327680 1099 Exclusive None 0 可以獲得的TX鎖定的總個數由初始化參數transactions決定,而可以獲得的TM鎖定的個數則由初始化參數dml_locks決定: select name,value from v$parameter where name in('transactions','dml_locks');
NAME, VALUEdml_locks 1084 transactions 271 查詢資源的使用方式: select resource_name as "R_N",current_utilization as "C_U",max_utilization as "M_U",initial_allocation as "I_U" from v$resource_limit where resource_name in('transactions','dml_locks'); R_N, C_U, M_U, I_U dml_locks 1 1 1084 transactions 1 1 271通過上面的參數可以知道dml_locks資源當前使用了1個而且最多的時候也只使用了1個,最大的資源數為1084transactions同上,通過這個可以判斷資源設定是否合理,假如M_U的值等於或者接近於I_U時說明需要增大I_U值因為:可以獲得的TX鎖定的總個數由初始化參數transactions決定,而可以獲得的TM鎖定的個數則由初始化參數dml_locks決定 |