关于oracle数据库死锁的解决 以及产生的原因

本文介绍了解决数据库中SQL语句造成的死锁问题的方法,包括如何查找死锁的会话、终止会话以及特殊情况下如何解除锁定。同时分析了死锁产生的原因,并提供了Navicat工具的解锁技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间写sql语句事物造成了数据库死锁,导致所有更新操作无法执行

1.查死锁

查看关于锁的会话信息

select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID

 

 

2.通过查询到的信息,杀掉会话

alter system kill session '49,423';  

其中后面的数字分别是  'sid,serial',即上图红圈内的字段内容

杀掉会话后,锁就会被释放了,操作就能正常进行了

 

3.有时通过这个上述方法杀掉了会话,状态变为killed,但是没有释放资源,可以使用如下的方法

执行如下SQL,其中sid为2中的sid

select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=277 

其中spid为操作系统的进程id,如果是在linux服务器造成的死锁,可以执行kill -9 32184

也可以用orakill orcl 32184

其中orcl是实例名,32184是spid

windows系统同理

---------------------------------------------------------------------------------

死锁的原因

虽然遇到了死锁,但是对于原因并不知道,现在再次遇到了同样的问题,而且重现了

下面说下造成死锁的原因

之所以会造成死锁,是因为我通过Navicat执行update语句并没有commit导致的,

通常我们通过项目提交的sql语句都会被自动commit的(模板),但是通过Navicat或plsql

手写的sql语句,有时候遇到网络不好或者其他问题,会出现没有commit的情况,语句会导致

数据库出现死锁的现象,这时候可以采用上述的方式杀掉死锁

-------意外情况,没有权限使用上述语句怎么办

我曾遇到过表被锁住的情况,但是客户不会给v$session的权限,

我使用Navicat的禁用表锁定,成功的释放了锁,不确定是否是普遍适用,

而且这种解锁方式肯定有很多局限性,建议大家不要轻易使用这种方式解锁

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值