ORA-60死锁的实验

原创 2013年12月03日 14:38:20

ORA-60死锁的实验


创建表:

SQL> create table tbl_ora_60 (
     id number(5),
     name varchar2(5)
     );

SQL> insert into tbl_ora_60 values(1, 'a');
1 row created.

SQL> insert into tbl_ora_60 values(2, 'b');
1 row created.

SQL> commit;
Commit complete.

SQL> select * from tbl_ora_60;
        ID NAME
---------- -----
         1 a
         2 b

实验开始
Session1:
SQL> update tbl_ora_60 set name='c' where id=1;
1 row updated.

Session2:
SQL> update tbl_ora_60 set name='d' where id=2;
1 row updated.

Session1:
SQL> update tbl_ora_60 set name='e' where id=2;
hang住

Session2:
SQL> update tbl_ora_60 set name='f' where id=1;
hang住

此时,Session1:
SQL> update tbl_ora_60 set name='e' where id=2;
update tbl_ora_60 set name='e' where id=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

说明:
Session1                                            Session2
获取id=1的资源锁
                                                        获取id=2的资源锁
等待id=2的资源锁
                                                        等待id=1的资源锁
id=2的SQL报ORA-60,自动rollback

1、因为id=2的资源锁是Session2先获取的,因此Oracle会自动rollback产生死锁时后需要资源锁的SQL,Session1的更新id=2操作被rollback。
2、从中可以发现,真正报ORA-60错误的SQL获取的资源(此例中id=2),并不是触发死锁产生的那个资源(此例中id=1),此例用的是同一个表的不同行,对不同表的相同行也如此,也可以解释之前夜维出现ORA-60时显示的SQL之间表是不同的原因,因为夜维执行的某个表更新与当前应用执行的某个表更新之间存在互锁的情况,因此可能导致夜维SQL报ORA-60或应用报ORA-60的错误。


此时,Session1:
SQL> select * from tbl_ora_60;
        ID NAME
---------- -----
         1 c
         2 b
说明:此处可以证明产生报错后,Oracle自动执行的rollback操作是基于单条SQL,不是整个事务的,所以这里只有id=2的记录被rollback,id=1的执行仍正常

Session2:
SQL> update tbl_ora_60 set name='f' where id=1;
hang住

继续,Session1:
SQL> commit;
Commit complete.

Session2:
SQL> update tbl_ora_60 set name='f' where id=1;
1 row updated.

Session1:
SQL> select * from tbl_ora_60;
        ID NAME
---------- -----
         1 c
         2 b
只有id=1更新成功。

Session2:
SQL> select * from tbl_ora_60;
        ID NAME
---------- -----
         1 f
         2 d
id=1和id=2都更新成功,但未COMMIT。

SQL> commit;
Commit complete.

Session1:
SQL> select * from tbl_ora_60;
        ID NAME
---------- -----
         1 f
         2 d
因Session2执行COMMIT,提交更新,此处显示与Session执行相同。
版权声明:本文为博主原创文章,未经博主允许不得转载。

死锁ora-60诊断

set wrap off set  line 132 col USERNAME for a7 col MACHINE for a10 col PROGRAM for a20 select u...
  • zhaojian1988
  • zhaojian1988
  • 2013年04月16日 10:31
  • 496

死锁ora-60诊断

set wrap off set  line 132 col USERNAME for a7 col MACHINE for a10 col PROGRAM for a20 select u...
  • zhaojian1988
  • zhaojian1988
  • 2013年04月16日 10:31
  • 496

ORA-60死锁的实验

http://blog.csdn.net/bisal/article/details/17095531 ORA-60死锁的实验 创建表: SQL> create ta...
  • goto1997
  • goto1997
  • 2017年04月18日 18:15
  • 106

操作系统实验六之死锁问题实验

实验要求 在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站 排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行 车,如果同时有相向的火车行驶将会撞车。请模拟...
  • u010467643
  • u010467643
  • 2014年05月26日 23:47
  • 1466

同步、通信与死锁

进程的同步与互斥 在多道程序的环境中,系统中的多个进程可以并发执行,同时它们又要共享系统中的资源,由此诸进程间会产生错综复杂的相互制约的关系。 一、进程间制约关系 1.竞争关系 ...
  • DJ5789121
  • DJ5789121
  • 2016年01月15日 10:34
  • 576

死锁的产生原理及必要条件,如何避免死锁

产生死锁的原因主要是:   (1) 因为系统资源不足。   (2) 进程运行推进的顺序不合适。   (3) 资源分配不当等。   如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低...
  • flying461
  • flying461
  • 2015年10月29日 17:18
  • 822

《操作系统》——死锁

在计算机中,各种资源(包括硬件资源和软件资源)都是由操作系统进行管理和分配的。但是如果资源分配不当,就会造成死锁。     死锁定义:系统中存在一组进程(两个或者多个),它们中的每一个进程都占用了某...
  • u013067402
  • u013067402
  • 2015年05月10日 20:01
  • 1135

并发:死锁和饥饿

死锁原理:     死锁定义wei
  • Al_xin
  • Al_xin
  • 2014年08月19日 17:04
  • 645

Linux 死锁例子

死锁是在编写多线程并发时候所需要考虑的问题,在多线程软件使用多个互斥锁来保护共享资源时,如果设计不合理会出现多个锁相互嵌套并且都在等待彼此的锁被释放,这样就会出现死锁现象,让系统挂起一直相互等待下去。...
  • huang3838438
  • huang3838438
  • 2014年01月08日 16:01
  • 2281

【操作系统 - 3】预防进程死锁的银行家算法

【操作系统 - 3】预防进程死锁的银行家算法:学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘。等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍。读...
  • Houchaoqun_XMU
  • Houchaoqun_XMU
  • 2017年03月18日 13:52
  • 2336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORA-60死锁的实验
举报原因:
原因补充:

(最多只允许输入30个字)