Oracle阻塞(鎖等待)查詢
主要查詢v$lock、v$session視圖。
v$lock中的id1,id2為鎖定的對象辨別,block為阻塞數目。腳本show_blocker.sql相關代碼如下:
col block_msg for a80
select c.terminal||' ('''||a.sid||','||c.serial#||''') is blocking '||b.sid block_msg
from v$lock a,v$lock b,v$session c
where a.id1=b.id1
and a.id2=b.id2
and a.block>0
and a.sid<>b.sid
and a.sid=c.sid
;
模拟場景:開3個session,
session1做更新,不送出。
session2做相同行的更新,将會被阻塞。
session3執行腳本觀察結果。
session1:
* from t where a=1;
A NAME ADDRESS
---------- ---------- --------------------
1 chennan
已選擇 1 行。
t set address='my address' where a=1;
已更新 1 行。
* from t where a=1;
A NAME ADDRESS
---------- ---------- --------------------
1 chennan my address
已選擇 1 行。
>
session2:
* from t where a=1;
A NAME ADDRESS
---------- ---------- --------------------
1 chennan
已選擇 1 行。
t set address='test' where a=1;
[ 一直阻塞 ...]
session3:
sid,serial#,terminal from v$session;
SID SERIAL# TERMINAL
---------- ---------- ----------------
1 1 CHENNAN
2 1 CHENNAN
3 1 CHENNAN
4 1 CHENNAN
5 1 CHENNAN
6 1 CHENNAN
7 1 CHENNAN
8 1 CHENNAN
9 204 CHENNAN
10 2590 CHENNAN
11 1480 CHENNAN
已選擇11行。
BLOCK_MSG
-----------------------------------------------------------
CHENNAN ('11,1480') is blocking 10
已選擇 1 行。