ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 模拟死锁

模拟死锁

原创 Linux操作系统 作者:安佰胜 时间:2011-10-18 11:26:49 0 删除 编辑

模拟死锁
=============
其实很简单,两个表,两个连接就可以
首先创建两个只有一行数据的表
an@DB10> create table a(id int);
表已创建。
an@DB10> create table b(id int);
表已创建。
an@DB10> insert into a select 1 from dual;
已创建 1 行。
an@DB10> insert into b select 1 from dual;
已创建 1 行。
an@DB10> commit;
提交完成。
只有在第一个连接中更新表a
an@DB10> update a set id=2;
已更新 1 行。
在第二个连接中更新表b
an@DB10> update b set id=2;
已更新 1 行。
此时更新互不影响,可以正常进行
如果这时在第二个连接中更新表a
因为第一个连接中没有提交,所以这时候第一个连接中的更新就会阻塞第二个连接中的更新
an@DB10> update a set id=3;
更新操作会等待第一个连接中资源的释放
这时第一个更新不论是提交还是回滚,只要释放资源,第二个连接中队a表的更新就可以返回
此时的情况其实就是连接1hold表a
连接2hold表b,并且等待a的释放
如果此时回到连接一,并发出更新表b的语句
相当于连接一申请表表b的资源
这时在第二个连接中更新表a的语句就出现了死锁
因为连接一出现等待,不能提交,第二个连接已经不可能得到更新表a的资源,所以会出现锁定,报错ora-00060

an@DB10> update b set id=2;
已更新 1 行。
an@DB10> update a set id=3;
update a set id=3
       *
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
如果此时连接2重新发出更新命令
update a set id=3
则连接一也会因为同样的问题侦测到死锁
 
 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13177610/viewspace-709283/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: ora_rowscn
请登录后发表评论 登录
全部评论

注册时间:2009-08-26

  • 博文量
    215
  • 访问量
    660346