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执行相同。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

操作系统实验--死锁

  • 2010-05-07 08:59
  • 58KB
  • 下载

未加索引的外键导致的死锁模拟实验以及问题

EODA@PROD1> create table pk_t (x int primary key); --建立主角 Table created. EODA@PROD1> insert into ...

操作系统死锁实验报告

  • 2014-07-01 10:52
  • 57KB
  • 下载

oracle的死锁实验

oracle当中的deadlock死锁,产生原因是由于两个会话互相征用对方占用的资源造成的。 当oracle检测到死锁时,会自动驳回一方请求冲突资源的请求,并报出 ORA-00060: 等待资源时...

数据库死锁原理实验

  • 2014-06-04 21:16
  • 285KB
  • 下载

线程加锁两次-死锁问题实验

今天遇到了这个问题,晚上回来写个例子试试,试试证明还是会死锁的。一个不同线程分别加锁的例子,这种情况是不会死锁的。#include #include pthread_mutex_t mutex...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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