[20140210]主外键和阻塞.txt
许多人都知道如果几个表之间存在主外键关系的情况下,许多情况下会出现阻塞情况。
具体的例子还很多,当然如果我觉得最常见如果你不修改主外键值,外键的索引多数情况下可以不建。
而且有些外键的索引建立有点多余的。
今天我看了一篇blog,链接如下:
http://blog.yavor.info/?p=564&lang=en
给出的例子很奇特,就是这个问题在11g下会出现阻塞,而10g下不会。12c下我也做了测试,也不会,
自己重复测试做一个记录:
1.12c的情况:
SCOTT@test01p> @ver
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
--数据准备
drop table t2 purge;
drop table t1 purge;
create table t1 (pk number primary key);
create table t2 (pk number primary key, fk number references t1(pk));
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);
insert into t1 values (4);
insert into t2 values (11, 1);
insert into t2 values (21, 2);
insert into t2 values (22, 2);
insert into t2 values (31, 3);
insert into t2 values (32, 3);
insert into t2 values (33, 3);
commit;
--会话1:
insert into t1 values (5);
--会话2:
delete from t1 where pk=4;
--没有出现阻塞情况!
--从这里看确实出现了修改主外键值的情况。但是没有阻塞的情况。
--其实我的理解这是非常特殊的情况,插入的值一定不能重复在t1表,也就是不会出现T2中,
--当然也有许多特殊情况,比如延迟references等等,先插入T2表的数据,在插入T1表数据,
--好像这样操作很少。
--这样的插入T1表不应该"阻塞"T2表。如果不"阻塞"T2表,delete from t1 where pk=4;时候
--就不会出现这种情况。出现"阻塞"的情况:
--会话1:
delete from t2 where fk=1;
1 row deleted.
--会话2:
delete from t1 where pk=4;
--hung!因为级联删除t2表的fk=4,t2表没有fk的索引,oracle要"lock"表t2.
2.11g的情况:
SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
--重复以上测试,出现阻塞情况。
3.10g的情况:
@ver
BANNER
-----------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
--重复以上测试,没有出现阻塞情况。
4.总结:
感觉oracle在开发上存在一些问题,也许不知道内部如何管理的。10g已经解决的问题,11g又出现。
难道10.2.0.1的版本也有问题吗?手头已经没有这些版本,无法再测试。