1. 程式人生 > >Oracle DML和DDL鎖的解決方法

Oracle DML和DDL鎖的解決方法

二、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