今天系统测试的时候,发现经常发送oracle的死锁,然后我打开pl/sql看是两张表;再细看它们是主从表关系。
具体的表信息如下:
-- 主表 create table LABLEINFOS_TABLE ( LABLE_ID VARCHAR2(38) not null, LABLE_NAME VARCHAR2(200) not null, CREATOR VARCHAR2(38) not null, CREATETIME DATE not null, EDITOR VARCHAR2(38), EDITTIME DATE, constraint PK_LABLEINFOS_TABLE primary key (LABLE_ID) );
-- 从表 create table SCHEME_LABLE_RERATION_TABLE ( ID VARCHAR2(38) not null, LABLE_ID VARCHAR2(38), MA_SD_SEQ_ID VARCHAR2(38) not null, CREATOR VARCHAR2(38), CREATTIME DATE, constraint PK_SCHEME_LABLE_RERATION_TABLE primary key (ID) ); alter table SCHEME_LABLE_RERATION_TABLE add constraint FK_SCHEME_L_REFERENCE_LABLEINF foreign key (LABLE_ID) references LABLEINFOS_TABLE (LABLE_ID);
有两存储过程需要对这两张表进行DML操作。
我记得tom说过:”不加索引的外键是死锁的头号原因“。
大概的原因知道了之后,我先把外键给删除了进行测试,果然不会发送死锁了。
现在把Tomas Keyte的书《Oracle 9i & 10g编程艺术》(强烈推荐)上的内容记录如下:
据Tomas 的经验,导致死锁的头号原因是外键未加索引(第二号原因是表上的位图索引遭到并发更新)。在以下两种情况下,Oracle在修改父表后会对子表加一个全表锁:
-EOF-