yangtingkun在"外键列上是否需要索引"这篇文章里介绍了在外键列上建索引的必要性,这篇文章里有提到:
这时会话被锁住,因为缺少了外键索引后,主表删除或更新记录会导致子表整个表被锁,而这会导致严重的系统并发问题。
这里怎样理解"主表删除或更新记录会导致子表整个表被锁"?
在这篇文章里,我们深入剖析了上述问题,并且得出了如下结论:
1、 在子表外键列上没有索引的情况下,主表删除或更新记录是否锁子表(lock the entire table in shared mode)跟子表上是否有mode为3的TM enqueue有关;锁子表的本质原因是因为oracle这里想对子表上的TM enqueue做convert;
2、 在子表外键列上有索引的情况下,主表删除或更新记录不会锁子表(lock the entire table in shared mode),不锁子表的本质原因是因为这时oracle就不对子表上的TM enqueue做convert了;
3、 alter table XXX disable table lock不能对子表做,否则主表就不能删除或者更新记录了。
4、 alter table XXX disable table lock并不能够解决在子表外键列上无索引情况下的并发问题。这个跟DSI405里描述的并不一致(405里说用了alter table XXX disable table lock后就可以不用在外键列上建索引了)。
学习了。