oracle-tom死锁演示

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值