ORA-00060: Deadlock detected 模拟死锁产生与解决方案
死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁产生的4个必要条件
产生死锁的必要条件:
- 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
- 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
- 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
环境介绍:
用户test01 创建表tab01,用户test02创建表tab02。Test01 更新tab01不提交,test02 更新表tab02不提交。然后test01 更新test02下的表tab02,此时有锁阻塞、锁等待情况发生。接着test02 更新test01下的tab01,那么此时就会有 test01、test02 都在等待对方的资源,但是资源无法释放,满足死锁条件死锁产生
创建test01用户:
SQL> create user test01 identified by test01; User created. SQL> grant create session,resource,dba to test01; Grant succeeded. SQL> conn test01/test01;
Connected.
SQL> create table tab01 (id number); Table created. SQL> insert into tab01 values(01); 1 row created. SQL> commit; Commit complete. SQL> select * from tab01; ID
----------
1
创建test02用户:
SQL> create user test02 identified by test02; User created. SQL> grant create session,resource,dba to test02; Grant succeeded. SQL> conn test02/test02;
Connected.
SQL> create table tab02 (id number); Table created. SQL> insert into tab02 values(02); 1 row created. SQL> commit; Commit complete. SQL> select * from tab02; ID
----------
2
制造死锁:
test01:
SQL> update tab01 set id=id*1; 1 row updated. SQL> update test02.tab02 set id=id*1;
update test02.tab02 set id=id*1
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
test02:
SQL> update tab02 set id=id*1 ; 1 row updated. SQL> update test01.tab01 set id=id*1;
此时一直会hang住
查看oracle后台日志,存在ORA-00060报错
ORA-00060: Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_3692.trc.
解决方案:
在我们知道是何原因引起死锁的时候,可以将一个用户的数据进行提交,可以解决死锁问题,但是如果实际生产过程中,用户以及应用产生的死锁,我们不清楚就需要去查询原因了。
1.使用PLSQL图形工具解决死锁
点击工具->会话

所有会话:

找到Blocking session status列,如果看到有valid的行,就说明存在死锁,点击箭头方向,killed掉死锁,然后进行会话刷新,就可以看到死锁被释放掉

点击该行,可以看到具体的SQL语句
kill掉该死锁刷新,就看不到该会话
后台语句

2.使用sqlplus进行语句查询
重新制造死锁:
SQL> update test02.tab02 set id=id*1;
update test02.tab02 set id=id*1
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
查询数据库中存在的死锁:
col BLOCKER for a20
col BLOCKEE for a15
select
(select username from v$session where sid=a.sid) blocker,a.sid,'is blocking',
(select username from v$session where sid=b.sid) blockee,b.sid
from v$lock a,v$lock b
where a.block=1
and b.request>0
and a.id1=b.id1
and a.id2=b.id2;

使用SQL语句生成杀锁会话方法:
col machine for a30
col kill_command for a50
col object_name for a20
col osuser for a15
col oracle_username for a30
set lines 400
select s.sid,s.machine,o.object_name,l.oracle_username,l.locked_mode,s.osuser,
'alter system kill session '''|| s.sid || ', '|| s.serial#||''';' as kill_command
from v$locked_object l,v$session s, all_objects o ,v$lock k
where k.block=0 and s.sid=k.sid and l.locked_mode>2 and l.session_id=s.sid and l.object_id=o.object_id order by 3;

根据sid查看锁会话sql语句
select a.sid,a.event,a.sql_id,a.sql_child_number,b.sql_text
from v$session a,v$sql b
where a.sql_address=b.address
and a.sql_hash_value=b.HASH_VALUE
and a.sql_child_number=b.child_number
order by 1 desc;

根据SQL语句生成杀锁会话方法给出的KILL_COMMAND
SQL> alter system kill session '70, 63'; System altered.
然后sqlplus中行住的SQL语句被强制结束:

观察后台日志,ospid (4064)操作系统4064号进程被强制终止。
Sun Sep 27 15:03:38 2020
ORA-00060: Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_3692.trc.
Sun Sep 27 15:10:25 2020
opiodr aborting process unknown ospid (4064) as a result of ORA-28
后续方法继续补充
ORA-00060: Deadlock detected 模拟死锁产生与解决方案的更多相关文章
- Troubleshooting "Global Enqueue Services Deadlock detected" (Doc ID 1443482.1)
In this Document _afrLoop=1021148011984950&id=1443482.1&displayIndex=1&_afrWindowMode= ...
- synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性
synchronized.volatile区别.synchronized锁粒度 synchronized synchronized是Java中的关键字,是一种同步锁.有以下几种用法: 用法 1.修饰方 ...
- 在db2数据库上模拟死锁场景 还是z上的
如果条件允许,起两个线程互相抢资源就行了,但问题是,时间上还需要同步,要做到完美控制,还得加其他逻辑,忒费事,所以可以用下面的办法: 在目标表上直接加个锁……简单,粗暴,直接……很好…… LOCK T ...
- 移动端为何不使用click而模拟tap事件及解决方案
移动端click会遇到2个问题,click会有200-300ms的延迟,同时click事件的延迟响应,会出现穿透,即点击会触发非当前层的点击事件. 为什么会存在延迟? Google开发者文档中有提到: ...
- A potentially dangerous Request.Path value was detected from the client异常解决方案
场景: 当URL中存在“<,>,*,%,&,:,/”特殊字符时,页面会抛出A potentially dangerous Request.Path value was detect ...
- 【笔记】排查CPU占用过高
本文是该教程视频的笔记 https://www.bilibili.com/video/BV15T4y1y7eH 1. 问题演示 将演示项目打包放到服务器运行 执行 curl http://localh ...
- 【锁】Oracle死锁(DeadLock)的分类及其模拟
[锁]Oracle死锁(DeadLock)的分类及其模拟 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- Oracle“死锁”模拟
本着实验优先的原则,先模拟死锁的发生,然后在列一下死锁产生的四个必要条件和处理死锁的一般策略. 1.创建两个简单的表t1_deadlock和t2_deadlock,每个表中仅仅包含一个字段asys@o ...
- 面试官:请用SQL模拟一个死锁
文章首发于公众号:BiggerBoy 有读者说面试被问到怎么用SQL模拟数据库死锁? 这位读者表示对Java中的死锁还是略知一二的,但是突然用SQL写死锁的案例之前还真没遇到过,这个问题没答上来.所以 ...
随机推荐
- 分享一个操作pdf文件的js文件-pdfObject.js(文件预览、下载、打印等操作都具备)
获取相关资料或者源码的朋友可以关注下公众号,回复关键字pdf20200518即可
- python安装wordcloud库报错
pip install wordcloud 安装成了这样 红彤彤的一片 解决方法 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 下载对应版 ...
- PHP - 读取EXCEL内容 存入数据库
<?php //设置请求头 header("Content-Type:text/html;charset=utf8"); header("Access-Contro ...
- Spring Security如何优雅的增加OAuth2协议授权模式
一.什么是OAuth2协议? OAuth 2.0 是一个关于授权的开放的网络协议,是目前最流行的授权机制. 数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据.系统从而产生一个短期的进入令 ...
- A little something to get you started(Hacker101 CTF)
打开题目的页面发现只有”Welcome to level 0. Enjoy your stay.“这么一行普通的文字,然后习惯性的打开浏览器的开发者工具的“network”模块,按下F5发现网页在请求 ...
- 51,N皇后
from typing import List# 这道题还是比较经典的深搜递归调用的问题.# 只需要保证二维列表的每一行,每一列,每一对角线只有一个皇后就好了.class Solution: def ...
- kotlin 作用域函数 : let、run、with、apply、 also、takeIf、takeUnless
1.官方文档 英文: https://kotlinlang.org/docs/reference/scope-functions.html 中文: https://www.kotlincn.net/d ...
- Unity内生成深度贴图
https://qiita.com/bokkuri_orz/items/08cbaeae6a34fed7f903 https://www.cnblogs.com/sifenkesi/p/4721649 ...
- 组件给App全局传值vue-bus的使用
npm安装 npm install vue-bus main.js引入 import VueBus from 'vue-bus' Vue.use(VueBus) 组件 getHouse(e){ thi ...
- Splay 记录
luogu 模板 P3391 [模板]文艺平衡树(Splay). 知识点:1.splay模板题,练习splay,rotate顺序:x变成z的儿子,x的一个儿子变为y的一个儿子(具体哪个看代码),y变为 ...