oracle 10g百科,Oracle 10g_百科

本文介绍了数据库锁等待现象,即程序执行过程中出现无响应的情况,这通常由于未提交的更新操作导致的等待。锁等待的定位可以通过SQL查询来实现,而解决方法包括单个或批量杀死会话。批量解锁方法通过PL/SQL代码实现,能够快速解除大量锁等待状态。
摘要由CSDN通过智能技术生成

死锁解决办法

大家通常会遇到这种现象,在自己web项目首页使用用户名,密码登入系统时,始终停留在本页面,无法进入系统,或是在执行某些操作后,系统一直处在等待状态,不出结果,后台也无任何错误提醒。此时,很大的可能就是资料库锁等待,所要查询的包含用户名和密码的表或是用户正操作的表正在被占用造成的。

锁等待的现象:程式在执行的过程中,点击确定或保存按钮,程式没有回响,也没有出现报错。

网上有很多人把这种现象称为死锁,是不合理的。此时的oracle并未发生任何死锁现象,只是它一直在等待使用者前一个操作的提交。

产生锁等待的原因:当对于资料库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。

锁等待定位方法:

Sql代码

select sql_text from v$sql where hash_value in

(select sql_hash_value from v$session where sid in

(select session_id from v$locked_object))

Sql代码

SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,

l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS

FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

以上两种方法皆可以,不过查询出来的属性不同,可以根据个人需要选择。其中有一种方法速度较快,但我忘记是哪一种了,您若遇到资料库出现和锁等待相符的现象,可以用这两种方法查询试一下,若得到结果,则说明确实发生锁等待现象了。

单个解决锁等待的方法:

Sql代码

alter system kill session 'sid, serial#'

其中的sid和serial可以通过上面锁等待定位方法的第二个方法得到,sid对应SESSION_ID,serial#对应SERIAL#。例如:

Sql代码

alter system kill session '130,2';

我通常会遇到上千个锁,实在没办法一个一个的kill掉了,所以我通常使用下述批量解锁方法。

批量解锁方法:

注:此方法应在plsql中运行

Sql代码

declare cursor mycur is

select b.sid,b.serial#

from v$locked_object a,v$session b

where a.session_id = b.sid group by b.sid,b.serial#;

begin

for cur in mycur loop

execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');

end loop;

end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值