SELECT l1.sid AS"阻塞会话ID",s1.username AS"阻塞用户",s1.osuser AS"阻塞OS用户",s1.machine AS"阻塞机器",l2.sid AS"被阻塞会话ID",s2.username AS"被阻塞用户",l1.typeAS"锁类型",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 =1AND l2.request >0AND l1.id1 = l2.id1
AND l1.id2 = l2.id2
AND l1.sid = s1.sid
AND l2.sid = s2.sid;
3. 查询特定对象的锁
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. 解锁方法
-- 1. 查找阻塞会话SELECT sid,serial#, username FROM v$session WHERE sid IN(SELECT blocking_session FROM v$sessionWHERE blocking_session ISNOTNULL);-- 2. 终止会话ALTER SYSTEM KILLSESSION'sid,serial#' IMMEDIATE;