解决oracle存储过程死锁问题

来源:互联网 发布:淘宝店铺各种图片尺寸 编辑:程序博客网 时间:2024/05/22 11:40

最近在写存储过程的时候,因为要测试存储过程的运行情况,中途操作失误,导致存储过程死锁,写了半天的东西编译不了了,没办法只能重新创建一个存储过程,以前的那个删也删不掉,用也用不了,很难受,最后是重启了数据库才解决这个问题。不过现在找到一种更简单的方法解决这个问题。
四步解决:
1、执行语句

select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;

查出来哪些对象被锁,得到sid
2、还是执行语句
alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)
kill该session (sid,serial#即为上面查出来的sid和serial#)
注:此语句只是将该存储过程的状态由active改为了killed,并没有彻底的释放该存储过程,所以还是编译不了存储过程
3、要解决这一问题只能在OS上杀死这一线程(进程)了
执行语句获得线程(进程)号

select spid, osuser, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=24 

(24是上面的sid)
4、在服务器上执行下列命令(数据库在哪台机子,就在哪台机子执行)

orakill sid thread

orakill是oracle提供的命令,一般装oracle的时候,已经配上环境变量,这里可直接运行
其中sid为该存储过程所在数据库的实例名我的为orcl
thread即为线程(进程)号,即第三步查出来的spid。

以上就是解决存储过程的死锁问题了,也是从别人那取经回来的东西,写出来,主要就是为了加强记忆