SELECT
l1.sid AS "阻塞会话ID",
s1.username AS "阻塞用户",
s1.osuser AS "阻塞OS用户",
s1.machine AS "阻塞机器",
l2.sid AS "被阻塞会话ID",
s2.username AS "被阻塞用户",
l1.type AS "锁类型",
DECODE(l1.type,
'TX', '事务锁',
'TM', '表锁',
'UL', '用户锁',
l1.type) AS "锁描述",
l1.ctime AS "持有时间(秒)"
FROM v$lock l1, v$lock l2, v$session s1, v$session s2
WHERE l1.block = 1
AND l2.request > 0
AND l1.id1 = l2.id1
AND l1.id2 = l2.id2
AND l1.sid = s1.sid
AND l2.sid = s2.sid;
3. 查询特定对象的锁
sql复制代码
SELECT l.sid, s.username, s.status, l.type, l.lmode, l.ctime, o.object_name
FROM v$lock l, dba_objects o, v$session s
WHERE l.id1 = o.object_id(+)
AND l.type = 'TM'
AND l.sid = s.sid
AND o.object_name = 'EMPLOYEES';
六、锁诊断与问题解决
1. 常见锁问题
TX锁等待:最常见的事务冲突
TM锁冲突:DDL与DML操作冲突
死锁:ORA-00060错误
2. 解锁方法
sql复制代码
-- 1. 查找阻塞会话
SELECT sid, serial#, username FROM v$session
WHERE sid IN (SELECT blocking_session FROM v$session WHERE blocking_session IS NOT NULL);
-- 2. 终止会话
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;