一、DML锁解决办法
假设锁在会话1上
session1:
?drop table test;
?create table test as select * from dba_objects;
?select * from test for update;
系统现在无法完成DML操作,这个时候要人工造成一个锁等待冲突的现象
session2:
?select sid from v$mystat where rownum=1; --204? 先查出被堵塞会话id
?select * from test for update;
排除,解决
session3:
--找到被堵塞会话中,可以看到行锁的等待事件enq: TX - row lock contention,还可以看到制造堵塞的源头
select w.EVENT,w.BLOCKING_INSTANCE,w.BLOCKING_SESSION from v$session w where w.sid=204;
?EVENT? ? ? ? ? ? ? ? ? ? ? ? ? BLOCKING_INSTANCE BLOCKING_SESSION
?------------------------------ ----------------- ----------------
?enq: TX - row lock contention? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? 134
查找到源头的会话信息
select s.INST_ID,s.SID,s.SERIAL# from gv$session s where s.INST_ID =1 and s.SID =134;
? ? INST_ID? ? ? ? SID? ? SERIAL#
?---------- ---------- ----------
? ? ? ? ? 1? ? ? ? 134? ? ? 3559
现在实例1上杀会话:
alter system kill session '134,3559';
有的时候不一定能杀掉,则需要在操作系统层面上杀:
select spid
? from gv$process p, gv$session s
? where p.INST_ID = s.INST_ID
? ? and p.INST_ID = 1
? ? and s.SID = 134
? ? and s.SERIAL# = 3559
? ? and p.ADDR = s.PADDR;
?SPID
?-----
?27004
? ?
登陆实例1执行
?
kill -9? 27004
二、DDL锁解决办法
?假设锁在会话1上
session1:
?create or replace procedure p_test is
?begin
? dbms_lock.sleep(1000);
?end;
?call p_test();
系统现在无法完成DML操作,这个时候要人工造成一个锁等待冲突的现象
session2:
?select sid from v$mystat where rownum=1; --134? 先查出被堵塞会话id
?drop procedure p_test;
排除,解决
session3:
--找到被堵塞会话中,可以看到行锁的等待事件enq: TX - row lock contention,还可以看到制造堵塞的源头
select w.EVENT,w.BLOCKING_INSTANCE,w.BLOCKING_SESSION from v$session w where w.sid=134;
?EVENT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BLOCKING_INSTANCE BLOCKING_SESSION
?---------------------------------------------------------------- ----------------- ----------------
?library cache pin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? 202
查找到源头的会话信息
select s.INST_ID,s.SID,s.SERIAL# from gv$session s where s.INST_ID =1 and s.SID =202;
? ? INST_ID? ? ? ? SID? ? SERIAL#
?---------- ---------- ----------
? ? ? ? ? 1? ? ? ? 202? ? ? 105
现在实例1上杀会话:
alter system kill session '202,105';
有的时候不一定能杀掉,则需要在操作系统层面上杀:
select spid
? from gv$process p, gv$session s
? where p.INST_ID = s.INST_ID
? ? and p.INST_ID = 1
? ? and s.SID = 202
? ? and s.SERIAL# = 105
? ? and p.ADDR = s.PADDR;
?SPID
?-----
?27008
? ?
登陆实例1执行
kill -9 27008