Oracle-監控使用者鎖
Oracle-監控使用者鎖
資料庫的鎖有時候是比較耗費資源的, 特別是發生鎖等待的時候, 我們必須找到發生等待的鎖, 有可能的話, 殺掉該程式. 下面的語句將找到資料庫中所有的DML語句產生的鎖,
還可以發現, 任何DML語句其實產生了兩個鎖, 一個是表鎖, 一個是行鎖. 可以透過alter system kill session ‘sid, serial#’來殺掉會話.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT /*+ rule */
s.username,
decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
FROM v$session s, v$lock l, dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL;
我們要關注TX和TM兩種型別的鎖, UL鎖為使用者自定義鎖, 一般很少會定義, 基本不用關注, 其他均為系統鎖, 會很快自動釋放, 不用關注.
ID1 NUMBER Lock identifier #1 (depends on type)
ID2 NUMBER Lock identifier #2 (depends on type)
當lock_type為TM時, Id1為DMLlocked object的object id . 當lock type 為TX時, id1為usn+slot, id2為seq. 當lock_type為其它時, 不用關注.
LMODE NUMBER Lock mode in which the session holds the lock:
? 0 - none
? 1 - null (NULL)
? 2 - row-S (SS)
? 3 - row-X (SX)
? 4 - share (S)
? 5 - S/Row-X (SSX)
? 6 - exclusive (X)
大於0時表示當前會話正以某種模式佔有該鎖, 等於0時表示當前會話正在等待該鎖資源, 即表示該會話被阻塞.
往往在發生TX鎖時, 伴隨TM鎖, 比如一個sid=9會話擁有一個TM鎖, 一般會擁有一個或幾個TX鎖, 但他們的id1和id2是不同的.
REQUEST NUMBER Lock mode in which the process requests the lock:
? 0 - none
? 1 - null (NULL)
? 2 - row-S (SS)
? 3 - row-X (SX)
? 4 - share (S)
? 5 - S/Row-X (SSX)
? 6 - exclusive (X)
大於0時表示會話被阻塞
CTIME NUMBER Time since current mode was granted
BLOCK NUMBER The lock is blocking another lock
該鎖是否阻塞了其他的會話.
0: not blocking /*沒有阻塞其他會話*/
1: blocking /*阻塞了其他會話*/
2: global /*未知情況*/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SQL> select * from v$lock;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
000000008FD8EDD8 000000008FD8EE30 5 RS 25 1 2 0 686887 2
000000008FD8DFC0 000000008FD8E018 5 XR 4 0 1 0 686894 2
000000008FD8DE00 000000008FD8DE58 5 RD 1 0 1 0 686894 2
000000008FD8E420 000000008FD8E478 5 CF 0 0 2 0 686891 2
000000008FD8FF70 000000008FD8FFC8 14 AE 100 0 4 0 79464 2
000000008FD8FB10 000000008FD8FB68 15 AE 100 0 4 0 81776 2
000000008CF32B18 000000008CF32B90 15 TX 589834 1078 6 0 77397 2
00002B25BA245BF8 00002B25BA245C58 15 TM 87546 0 3 0 79085 2
000000008FD8DEE0 000000008FD8DF38 64 XR 0 0 1 0 686894 2
000000008FD8E0A0 000000008FD8E0F8 69 TS 3 1 3 0 686884 2
000000008FD8E180 000000008FD8E1D8 70 AE 100 0 4 0 686878 2
000000008FD8E260 000000008FD8E2B8 70 CO 0 0 6 0 686883 2
000000008FD8F5B8 000000008FD8F610 130 DM 1 0 4 0 686885 2
000000008FD8E6C0 000000008FD8E718 130 MR 1 8 4 0 686887 2
000000008FD8E7A0 000000008FD8E7F8 130 MR 2 8 4 0 686887 2
000000008FD8E880 000000008FD8E8D8 130 MR 3 8 4 0 686887 2
000000008FD8E960 000000008FD8E9B8 130 MR 4 8 4 0 686887 2
000000008FD8EA40 000000008FD8EA98 130 MR 5 8 4 0 686887 2
000000008FD8EB20 000000008FD8EB78 130 MR 201 8 4 0 686887 2
000000008FD8EC18 000000008FD8EC70 130 MR 3 0 4 0 686886 2
000000008FD8F238 000000008FD8F290 130 MR 4 0 4 0 686886 2
000000008FD8F3F8 000000008FD8F450 130 MR 5 0 4 0 686886 2
000000008FD8F158 000000008FD8F1B0 130 MR 1 0 4 0 686886 2
000000008FD8EEB8 000000008FD8EF10 130 MR 2 0 4 0 686886 2
000000008FD8F4D8 000000008FD8F530 130 MR 201 0 4 0 686886 2
000000008FD8EF98 000000008FD8EFF0 130 RT 1 2 6 0 686886 2
000000008FD90590 000000008FD905E8 134 AE 100 0 4 0 75571 2
000000008FD8F698 000000008FD8F6F0 140 AE 100 0 4 0 686870 2
000000008FD903D0 000000008FD90428 143 AE 100 0 4 0 81027 2
000000008FD8ECF8 000000008FD8ED50 188 KD 0 0 6 0 686883 2
000000008FD8E500 000000008FD8E558 188 KT 12876 0 4 0 34635 2
000000008FD8E5E0 000000008FD8E638 191 RT 1 0 6 0 686887 2
000000008FD8F078 000000008FD8F0D0 191 RT 1 1 6 0 686886 2
000000008FD8FDB0 000000008FD8FE08 199 AE 100 0 4 0 686870 2
34 rows selected.
SQL>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 oracle鎖概念基礎
資料庫是一個多使用者使用的共享資源. 當多個使用者併發地存取資料時, 在資料庫中就會產生多個事務同時存取同一資料的情況. 若對併發操作不加控制就可能會讀取和儲存不正確的資料, 破壞資料的一致性.
加鎖是實現資料庫併發控制的一個非常重要的技術. 當事務在對某個資料物件進行操作前, 先向系統發出請求, 對其加鎖. 加鎖後事務就對該資料物件有了一定的控制, 在該事務釋放鎖之前, 其他的事務不能對此資料物件進行更新操作.
3.1.1 oracle資料庫的鎖型別
根據保護的物件不同, oracle資料庫鎖可以分為以下幾個大類:
? DML鎖(data locks 資料鎖), 使用者保護資料的完整性;
? DDL鎖(dictionary locks, 字典鎖)用於保護資料庫物件的結構, 如表, 索引等的結構定義;
? 內部鎖和閂(internal locks and latches), 保護資料庫的內部結構.
DML鎖的目的在於保證併發情況下的資料完整性. 在oracle資料庫中, DML鎖主要包括TM鎖和TX鎖, 其中TM鎖稱為表級鎖, TX鎖稱為事務鎖或行鎖.
當oracle執行DML語句時, 系統自動在所要操作的表上申請TM型別的鎖. 當TM鎖獲得後, 系統再自動申請TX型別的鎖, 並將實際鎖定的資料行的鎖標誌位進行置位. 這樣在事務鎖加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌, 而只需要檢查TM鎖模式的相容性即可, 從而大大提供了系統的效率. TM鎖包括了SS, SX, S, X等多種模式, 在資料庫中用0-6來表示, 不同的SQL操作產生不同型別的TM鎖.
在資料行上只有X鎖(排他鎖). 在oracle中, 當一個事務首先發起一個DML語句時就獲得一個TX鎖, 該鎖保持到事務被提交或回滾. 當兩個或多個會話在表的同一條記錄上執行DML語句時, 第一個會話在該條記錄上加鎖, 其他的會話處於等待狀態. 當第一個會話提交後, TX鎖被釋放, 其他會話才可以加鎖.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 oracle的TX級鎖
許多對oracle不太瞭解的技術人員可能會以為每一個TX鎖代表一條封鎖的資料行, 其實不然, TX的本意是transaction(事務), 當一個事務第一次執行資料更改時, 它即獲得一個TX鎖, 直到事務結束, 該鎖才會被釋放.
在oracle的每行資料上, 都有一個標誌位來表示該行資料是否被鎖定. 資料行上的鎖標誌一旦被置位, 就表明該行資料被加X鎖, oracle在資料行上沒有S鎖.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 oracle的TM鎖
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖標誌的開銷將很大,系統的效能將會受到影響。為了解決這個問題,可以在表級引入新的鎖型別來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。
3.1 意向鎖的型別
由兩種基本的鎖型別(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個資料庫物件加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖;
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫物件加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。
另外,基本的鎖型別(S、X)與意向鎖型別(IS、IX)之間還可以組合出新的鎖型別,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這裡的“=”指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。
這樣我們又可以引入一種新的鎖的型別
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖):如果對一個資料庫物件加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX.例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。
這樣資料庫物件上所加的鎖型別就可能有5種:即S、X、IS、IX、SIX.
具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫物件加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。
3.2 oracle的TM鎖
Oracle的DML鎖(資料鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)型別共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。需要注意的是,由於Oracle在行級只提供X鎖,所以與RS鎖(透過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行資料實際上還沒有被修改),這與理論上的IS鎖是有區別的。
下表為Oracle資料庫TM鎖的相容矩陣(Y=Yes,表示相容的請求;N=No,表示不相容的請求;-表示沒有加鎖請求):
T2
T1 S X RS RX SRX -
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 監控被鎖定的物件
select rpad(oracle_username, 10) o_name,
session_id sid,
decode(locked_mode,
0,
'None',
1,
'Null',
2,
'Row share',
3,
'Row Exclusive',
4,
'Share',
5,
'Share Row Exclusive',
6,
'Exclusive') lock_type,
object_name,
xidusn,
xidslot,
xidsqn
from v$locked_object, all_objects
where v$locked_object.object_id = all_objects.object_id;
This view lists all locks acquired by every transaction on the system.
Column Datatype Description
XIDUSN NUMBER Undo segment number 回滾段號
XIDSLOT NUMBER Slot number 槽號
XIDSQN NUMBER Sequence number 序列號
OBJECT_ID NUMBER Object ID being locked 被鎖物件標識
SESSION_ID NUMBER Session ID持有鎖的會話
ORACLE_USERNAME VARCHAR2(30) Oracle user name持有該鎖的使用者的oracle使用者名稱
OS_USER_NAME VARCHAR2(15) OS user name持有該鎖的使用者的作業系統使用者
PROCESS VARCHAR2(9) OS process ID作業系統程式號
LOCKED_MODE NUMBER Lock mode 鎖模式
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 跟使用者鎖相關的其他動態效能檢視
1.查詢資料庫中的鎖
select * from v$lock;
select * from v$lock where block=1;
2.查詢被鎖的物件
select * from v$locked_object;
3.查詢阻塞
查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');
查阻塞別的會話鎖
select * from v$lock where lmode>0 and type in ('TM','TX');
4.查詢資料庫正在等待鎖的程式
select * from v$session where lockwait is not null;
5.查詢會話之間鎖等待的關係
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;
6.查詢鎖等待事件
select * from v$session_wait where event='enqueue';
資料庫的鎖有時候是比較耗費資源的, 特別是發生鎖等待的時候, 我們必須找到發生等待的鎖, 有可能的話, 殺掉該程式. 下面的語句將找到資料庫中所有的DML語句產生的鎖,
還可以發現, 任何DML語句其實產生了兩個鎖, 一個是表鎖, 一個是行鎖. 可以透過alter system kill session ‘sid, serial#’來殺掉會話.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SELECT /*+ rule */
s.username,
decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
FROM v$session s, v$lock l, dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL;
我們要關注TX和TM兩種型別的鎖, UL鎖為使用者自定義鎖, 一般很少會定義, 基本不用關注, 其他均為系統鎖, 會很快自動釋放, 不用關注.
ID1 NUMBER Lock identifier #1 (depends on type)
ID2 NUMBER Lock identifier #2 (depends on type)
當lock_type為TM時, Id1為DMLlocked object的object id . 當lock type 為TX時, id1為usn+slot, id2為seq. 當lock_type為其它時, 不用關注.
LMODE NUMBER Lock mode in which the session holds the lock:
? 0 - none
? 1 - null (NULL)
? 2 - row-S (SS)
? 3 - row-X (SX)
? 4 - share (S)
? 5 - S/Row-X (SSX)
? 6 - exclusive (X)
大於0時表示當前會話正以某種模式佔有該鎖, 等於0時表示當前會話正在等待該鎖資源, 即表示該會話被阻塞.
往往在發生TX鎖時, 伴隨TM鎖, 比如一個sid=9會話擁有一個TM鎖, 一般會擁有一個或幾個TX鎖, 但他們的id1和id2是不同的.
REQUEST NUMBER Lock mode in which the process requests the lock:
? 0 - none
? 1 - null (NULL)
? 2 - row-S (SS)
? 3 - row-X (SX)
? 4 - share (S)
? 5 - S/Row-X (SSX)
? 6 - exclusive (X)
大於0時表示會話被阻塞
CTIME NUMBER Time since current mode was granted
BLOCK NUMBER The lock is blocking another lock
該鎖是否阻塞了其他的會話.
0: not blocking /*沒有阻塞其他會話*/
1: blocking /*阻塞了其他會話*/
2: global /*未知情況*/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SQL> select * from v$lock;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
000000008FD8EDD8 000000008FD8EE30 5 RS 25 1 2 0 686887 2
000000008FD8DFC0 000000008FD8E018 5 XR 4 0 1 0 686894 2
000000008FD8DE00 000000008FD8DE58 5 RD 1 0 1 0 686894 2
000000008FD8E420 000000008FD8E478 5 CF 0 0 2 0 686891 2
000000008FD8FF70 000000008FD8FFC8 14 AE 100 0 4 0 79464 2
000000008FD8FB10 000000008FD8FB68 15 AE 100 0 4 0 81776 2
000000008CF32B18 000000008CF32B90 15 TX 589834 1078 6 0 77397 2
00002B25BA245BF8 00002B25BA245C58 15 TM 87546 0 3 0 79085 2
000000008FD8DEE0 000000008FD8DF38 64 XR 0 0 1 0 686894 2
000000008FD8E0A0 000000008FD8E0F8 69 TS 3 1 3 0 686884 2
000000008FD8E180 000000008FD8E1D8 70 AE 100 0 4 0 686878 2
000000008FD8E260 000000008FD8E2B8 70 CO 0 0 6 0 686883 2
000000008FD8F5B8 000000008FD8F610 130 DM 1 0 4 0 686885 2
000000008FD8E6C0 000000008FD8E718 130 MR 1 8 4 0 686887 2
000000008FD8E7A0 000000008FD8E7F8 130 MR 2 8 4 0 686887 2
000000008FD8E880 000000008FD8E8D8 130 MR 3 8 4 0 686887 2
000000008FD8E960 000000008FD8E9B8 130 MR 4 8 4 0 686887 2
000000008FD8EA40 000000008FD8EA98 130 MR 5 8 4 0 686887 2
000000008FD8EB20 000000008FD8EB78 130 MR 201 8 4 0 686887 2
000000008FD8EC18 000000008FD8EC70 130 MR 3 0 4 0 686886 2
000000008FD8F238 000000008FD8F290 130 MR 4 0 4 0 686886 2
000000008FD8F3F8 000000008FD8F450 130 MR 5 0 4 0 686886 2
000000008FD8F158 000000008FD8F1B0 130 MR 1 0 4 0 686886 2
000000008FD8EEB8 000000008FD8EF10 130 MR 2 0 4 0 686886 2
000000008FD8F4D8 000000008FD8F530 130 MR 201 0 4 0 686886 2
000000008FD8EF98 000000008FD8EFF0 130 RT 1 2 6 0 686886 2
000000008FD90590 000000008FD905E8 134 AE 100 0 4 0 75571 2
000000008FD8F698 000000008FD8F6F0 140 AE 100 0 4 0 686870 2
000000008FD903D0 000000008FD90428 143 AE 100 0 4 0 81027 2
000000008FD8ECF8 000000008FD8ED50 188 KD 0 0 6 0 686883 2
000000008FD8E500 000000008FD8E558 188 KT 12876 0 4 0 34635 2
000000008FD8E5E0 000000008FD8E638 191 RT 1 0 6 0 686887 2
000000008FD8F078 000000008FD8F0D0 191 RT 1 1 6 0 686886 2
000000008FD8FDB0 000000008FD8FE08 199 AE 100 0 4 0 686870 2
34 rows selected.
SQL>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 oracle鎖概念基礎
資料庫是一個多使用者使用的共享資源. 當多個使用者併發地存取資料時, 在資料庫中就會產生多個事務同時存取同一資料的情況. 若對併發操作不加控制就可能會讀取和儲存不正確的資料, 破壞資料的一致性.
加鎖是實現資料庫併發控制的一個非常重要的技術. 當事務在對某個資料物件進行操作前, 先向系統發出請求, 對其加鎖. 加鎖後事務就對該資料物件有了一定的控制, 在該事務釋放鎖之前, 其他的事務不能對此資料物件進行更新操作.
3.1.1 oracle資料庫的鎖型別
根據保護的物件不同, oracle資料庫鎖可以分為以下幾個大類:
? DML鎖(data locks 資料鎖), 使用者保護資料的完整性;
? DDL鎖(dictionary locks, 字典鎖)用於保護資料庫物件的結構, 如表, 索引等的結構定義;
? 內部鎖和閂(internal locks and latches), 保護資料庫的內部結構.
DML鎖的目的在於保證併發情況下的資料完整性. 在oracle資料庫中, DML鎖主要包括TM鎖和TX鎖, 其中TM鎖稱為表級鎖, TX鎖稱為事務鎖或行鎖.
當oracle執行DML語句時, 系統自動在所要操作的表上申請TM型別的鎖. 當TM鎖獲得後, 系統再自動申請TX型別的鎖, 並將實際鎖定的資料行的鎖標誌位進行置位. 這樣在事務鎖加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌, 而只需要檢查TM鎖模式的相容性即可, 從而大大提供了系統的效率. TM鎖包括了SS, SX, S, X等多種模式, 在資料庫中用0-6來表示, 不同的SQL操作產生不同型別的TM鎖.
在資料行上只有X鎖(排他鎖). 在oracle中, 當一個事務首先發起一個DML語句時就獲得一個TX鎖, 該鎖保持到事務被提交或回滾. 當兩個或多個會話在表的同一條記錄上執行DML語句時, 第一個會話在該條記錄上加鎖, 其他的會話處於等待狀態. 當第一個會話提交後, TX鎖被釋放, 其他會話才可以加鎖.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 oracle的TX級鎖
許多對oracle不太瞭解的技術人員可能會以為每一個TX鎖代表一條封鎖的資料行, 其實不然, TX的本意是transaction(事務), 當一個事務第一次執行資料更改時, 它即獲得一個TX鎖, 直到事務結束, 該鎖才會被釋放.
在oracle的每行資料上, 都有一個標誌位來表示該行資料是否被鎖定. 資料行上的鎖標誌一旦被置位, 就表明該行資料被加X鎖, oracle在資料行上沒有S鎖.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 oracle的TM鎖
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖標誌的開銷將很大,系統的效能將會受到影響。為了解決這個問題,可以在表級引入新的鎖型別來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對錶中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對錶加鎖時,就不再需要檢查表中每行記錄的鎖標誌位了,系統效率得以大大提高。
3.1 意向鎖的型別
由兩種基本的鎖型別(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個資料庫物件加S鎖,首先要對其上級結點加IS鎖,表示它的後裔結點擬(意向)加S鎖;
意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個資料庫物件加X鎖,首先要對其上級結點加IX鎖,表示它的後裔結點擬(意向)加X鎖。
另外,基本的鎖型別(S、X)與意向鎖型別(IS、IX)之間還可以組合出新的鎖型別,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這裡的“=”指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。
這樣我們又可以引入一種新的鎖的型別
共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖):如果對一個資料庫物件加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX.例如:事務對某個表加SIX鎖,則表示該事務要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。
這樣資料庫物件上所加的鎖型別就可能有5種:即S、X、IS、IX、SIX.
具有意向鎖的多粒度封鎖方法中任意事務T要對一個資料庫物件加鎖,必須先對它的上層結點加意向鎖。申請封鎖時應按自上而下的次序進行;釋放封鎖時則應按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統的併發度,減少了加鎖和解鎖的開銷。
3.2 oracle的TM鎖
Oracle的DML鎖(資料鎖)正是採用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)型別共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應。需要注意的是,由於Oracle在行級只提供X鎖,所以與RS鎖(透過SELECT … FOR UPDATE語句獲得)對應的行級鎖也是X鎖(但是該行資料實際上還沒有被修改),這與理論上的IS鎖是有區別的。
下表為Oracle資料庫TM鎖的相容矩陣(Y=Yes,表示相容的請求;N=No,表示不相容的請求;-表示沒有加鎖請求):
T2
T1 S X RS RX SRX -
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 監控被鎖定的物件
select rpad(oracle_username, 10) o_name,
session_id sid,
decode(locked_mode,
0,
'None',
1,
'Null',
2,
'Row share',
3,
'Row Exclusive',
4,
'Share',
5,
'Share Row Exclusive',
6,
'Exclusive') lock_type,
object_name,
xidusn,
xidslot,
xidsqn
from v$locked_object, all_objects
where v$locked_object.object_id = all_objects.object_id;
This view lists all locks acquired by every transaction on the system.
Column Datatype Description
XIDUSN NUMBER Undo segment number 回滾段號
XIDSLOT NUMBER Slot number 槽號
XIDSQN NUMBER Sequence number 序列號
OBJECT_ID NUMBER Object ID being locked 被鎖物件標識
SESSION_ID NUMBER Session ID持有鎖的會話
ORACLE_USERNAME VARCHAR2(30) Oracle user name持有該鎖的使用者的oracle使用者名稱
OS_USER_NAME VARCHAR2(15) OS user name持有該鎖的使用者的作業系統使用者
PROCESS VARCHAR2(9) OS process ID作業系統程式號
LOCKED_MODE NUMBER Lock mode 鎖模式
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 跟使用者鎖相關的其他動態效能檢視
1.查詢資料庫中的鎖
select * from v$lock;
select * from v$lock where block=1;
2.查詢被鎖的物件
select * from v$locked_object;
3.查詢阻塞
查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');
查阻塞別的會話鎖
select * from v$lock where lmode>0 and type in ('TM','TX');
4.查詢資料庫正在等待鎖的程式
select * from v$session where lockwait is not null;
5.查詢會話之間鎖等待的關係
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;
6.查詢鎖等待事件
select * from v$session_wait where event='enqueue';
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29500582/viewspace-1353784/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle-常用監控SQLOracleSQL
- Oracle-監控oracle的等待事件Oracle事件
- Oracle-監控使用系統資源較多的使用者資訊Oracle
- Oracle-監控sql語句的過載率OracleSQL
- Oracle-監控緩衝區的命中率Oracle
- PostgreSQL之鎖監控指令碼SQL指令碼
- DB2 鎖的監控DB2
- Oracle-解鎖scott賬戶Oracle
- oracle 監控 DML DDL 鎖 的4個檢視Oracle
- 監控Oracle系統中鎖的常用指令碼Oracle指令碼
- android 手機監聽螢幕鎖屏,使用者解鎖Android
- sybase空間監控和死鎖檢測語句
- 使用表查詢監控DB2的死鎖DB2
- 黑盒監控、日誌監控
- MySQL調優使用者監控之show processlistMySql
- MySQLwwwhj8828com18088045700鎖分析和監控MySql
- PostgreSQL鎖等待監控珍藏級SQL-誰堵塞了誰SQL
- 6.prometheus監控--監控dockerPrometheusDocker
- 如何進行網站的真實使用者監控(RUM)?怎麼進入監控網站網站
- TiDB監控實現--存活監控TiDB
- 聊聊前端監控——錯誤監控篇前端
- nagios監控例項 -- PostgreSQL監控iOSSQL
- APM 終端使用者體驗監控分析(上)
- APM終端使用者體驗監控分析(下)
- 使用Procwatcher監控Oracle資料庫鎖定Contention(上)Oracle資料庫
- APM效能監控軟體的監控型別服務及監控流程型別
- 【SQL監控】SQL完全監控的指令碼SQL指令碼
- 伺服器監控之 ping 監控伺服器
- 3-主機監控、應用監控
- Redis監控Redis
- 批量監控
- index 監控Index
- nginx監控Nginx
- centos 監控CentOS
- zabbix監控
- 夜鶯監控
- 記一次 .NET 某裝置監控系統 死鎖分析
- mysql 的一個監控指令碼,監控heartbeatMySql指令碼