ORA-00060: Deadlock detected 模拟死锁产生与解决方案

ORA-00060: Deadlock detected 模拟死锁产生与解决方案,第1张

概述死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程

死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁产生的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>test02;Connected.sql> create table tab02 (ID number);table created.sql>  insert into tab02 values(02 commit;Commit complete.sql>   tab02;    ID----------     2

制造死锁:

test01:

sql> update tab01 set ID=ID*; row updated.sql> update test02.tab02 ;update test02.tab02 1              *ERROR at line :ORA-00060: deadlock detected while waiting for resource

test02:

sql> update tab02  ; row updated.sql> update test01.tab01 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 1*for resource

查询数据库中存在的死锁:

col BLOCKER for a20col BLOCKEE  a15select(select username from v$session where sID=a.sID) blocker,a.sID,'is blocking',(where sID=b.sID) blockee,b.sID   from v$lock a,v$lock b    where a.block=     and b.request>0  and a.ID1=b.ID1  and a.ID2=b.ID2;

 

 

使用SQL语句生成杀锁会话方法:

col machine  a30col kill_command  a50col object_name  a20col osuser  a15col oracle_username  a30set lines 400 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_commandfrom v$locked_object l,v$session s,all_objects o,1)"> kwhere 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;

 

@H_548_301@

 

 根据sID查看锁会话SQL语句:

select a.sID,a.event v$session a,v$sql bwhere a.sql_address=b.addressand a.sql_hash_value=b.HASH_VALUEand a.sql_child_number=b.child_numberorder 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 2020ORA-00060: Deadlock detected. More info in file /u01/app/oracle/diag/rdbms/prod/PROD/trace/PROD_ora_3692.trc.Sun Sep 10:25 opiodr aborting process unkNown ospID (4064) as a result of ORA-28

后续方法继续补充

 

总结

以上是内存溢出为你收集整理的ORA-00060: Deadlock detected 模拟死锁产生与解决方案全部内容,希望文章能够帮你解决ORA-00060: Deadlock detected 模拟死锁产生与解决方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1153235.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存