Oracle DML和DDL锁的解决方法

    普通的开发人员经常会遇到删除,修改数据遇到锁,还有修改或删除存储过程产生锁。请看下面的例子:

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值