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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15720542/viewspace-721840/