操作不當導致資料表被鎖定,需快速找出阻塞會話並釋放。本文以 Oracle 資料字典視圖為例,原理通用於其他資料庫。
SELECT
sn.USERNAME,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE(m.LMODE,
0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.',
4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
LTRIM(TO_CHAR(m.LMODE, '990'))) AS LMODE,
DECODE(m.REQUEST,
0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.',
4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive',
LTRIM(TO_CHAR(m.REQUEST, '990'))) AS REQUEST,
m.ID1, m.ID2
FROM V$SESSION sn, V$LOCK m
WHERE (sn.SID = m.SID AND m.REQUEST != 0) -- 存在鎖請求,被阻塞
OR (sn.SID = m.SID AND m.REQUEST = 0 AND m.LMODE != 4
AND (m.ID1, m.ID2) IN (
SELECT s.ID1, s.ID2 FROM V$LOCK s
WHERE s.REQUEST != 0 AND s.ID1 = m.ID1 AND s.ID2 = m.ID2
)) -- 持有鎖且被其他會話請求
ORDER BY m.ID1, m.ID2, m.REQUEST;
關鍵欄位:SID、SERIAL# 識別會話;LMODE 持有鎖模式;REQUEST 請求鎖模式;ID1, ID2 鎖定資源識別碼。
ALTER SYSTEM KILL SESSION 'sid,serial#';
以查得的 SID、SERIAL# 代入,立即終止阻塞會話,資源自動釋放。
sys.dm_tran_locks、sys.dm_exec_sessions、KILL spid。