普通的Oracle开发人员经常会遇到删除,修改数据遇到锁,还有修改或删除存储过程产生锁。请看下面的例子:一、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