session 2:

SQL> delete from p where id=3;

已删除 1 行。


SQL>

--====================

session 3:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in

2 (159,128) order by sid;


SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

---------- -- ---------- ---------- ---------- ---------- ---------- ----------

128 TM 13017 0 3 0 30 0

128 TX 393219 372 6 0 541 0

128 TM 13020 0 3 0 541 0

159 TX 131078 387 6 0 643 0

159 TM 13020 0 3 0 643 0

159 TM 13017 0 3 0 447 0


已选择6行。


SQL>

同理r上有了index之后,session 2(sid:128)中的操作delete from p where id=3执行之后

加在主表p上的锁mode由原来的2变成了3,而且没有index之前请求的子表r上的锁mode是5,现在变成了3,

锁mode 3和session 1里面insert操作引起的锁mode 3在行级锁不发生冲突(因为2个session操作的r表里的数据不是同一行)

的情况下是可以兼容的,因此session 1(sid:159)不再阻塞session 2;没有了相互阻塞,死锁也就不会发生了,

因此在外键上创建index不仅会提高由于操作(比如delete主表数据)主表主键

数据而引起的扫描子表的效率而且也可以避免操作主表数据而引起的阻塞和死锁问题




oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html