ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle-tom死锁演示

oracle-tom死锁演示

原创 Linux操作系统 作者:oracle_db 时间:2012-04-20 19:48:29 0 删除 编辑
Oracle 中极少出现死锁,甚至可以认为几乎不存在。通常情况下必须人为地提供条件才会产生死锁

死锁原因:导致死锁的头号原因是外键未加索引,第二号原因是表上的位图索引遭到并发更新

在以下两种情况下,Oracle 在修改父表后会对子表加一个全表锁:
如果更新了父表的主键(倘若遵循关系数据库的原则,即主键应当是不可变的,这种情况就很少见),由于外键上没有索引,所以子表会被锁住。如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引)。


会话1:

SQL> show user;
USER is ""
SQL> conn /as sysdba
Connected.
SQL> show user;
USER is "SYS"
SQL> create table p ( x int primary key );

Table created.

SQL> create table c ( x references p );

Table created.

SQL> insert into p values ( 1 );
insert into p values ( 2 );
commit;
1 row created.

SQL> 
1 row created.
SQL> insert into c values ( 2 );

1 row created.

SQL> 
会话2:

SQL> conn scott/scott
Connected.
SQL> conn /as sysdba
Connected.
SQL> desc c
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                                  NUMBER(38)

SQL> desc p
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL NUMBER(38)

SQL> delete from p where x=1;

这个时候会话2就被阻塞了。它在执行删除之前试图对表C 加一个全表锁。现在,别的会话都不能对C 中的任何行执行DELETE、INSERT 或UPDATE(已经开始的会话可以继续[3],但是新会话将无法修改C)。


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

下一篇: rman backup
请登录后发表评论 登录
全部评论

注册时间:2008-11-13

  • 博文量
    158
  • 访问量
    306826