無索引的外來鍵之主表子表DML操作實驗及結論

不一樣的天空w發表於2019-12-05

子表上的insert 操作執行後不提交,會阻塞後續主表上的update、delete、insert操作(針對包含主鍵列的的操作),主表、

子表都是TM鎖,外來鍵加索引後消除阻塞問題。   


create table test_pk1 (id number,pcol varchar2(1)) tablespace users;

alter table test_pk1 add constraint pk_test_pk1_id primary key(id) using index tablespace users;

insert into test_pk1 values(1,'A');

insert into test_pk1 values(2,'B');

insert into test_pk1 values(3,'C');

insert into test_pk1 values(4,'D');

insert into test_pk1 values(5,'E');

commit;


create table test_fk1 (id number,fcol varchar2(1)) tablespace users;

alter table test_fk1 add constraint fk_test_fk1_id foreign key(id) references test_pk1(id);

insert into test_fk1 values(1,'a');

insert into test_fk1 values(2,'a');

commit;


場景一:子表執行insert操作後不提交,另一個事務對主表進行update、delete、insert

--子表

insert into test_fk1 values(5,'d');


--主表

update test_pk1 set id=55 where id='4';

delete test_pk1 where id='3';

insert into test_pk1 values(6,'F');


結論:子表上的insert 操作執行後不提交,會阻塞後續主表上的update、delete、insert操作(針對包含主鍵列的的操作),

主表、子表都是TM鎖。


--給外來鍵加索引後,然後進行主表的update、delete、insert操作看是否會有影響

create index idx_id on test_fk1(id);


結論:外來鍵加索引後消除阻塞問題。  


場景二:子表執行update操作後不提交,另一個事務對主表進行update、delete、insert 

--子表

update test_fk1 set fcol='b' where id='2';


--主表

update test_pk1 set id=55 where id='4';

delete test_pk1 where id='3';

insert into test_pk1 values(6,'F');


結論:子表上的update操作執行後不提交,對主表上的update、delete、insert操作無影響。


場景三:子表執行delete操作後不提交,另一個事務對主表進行update、delete、insert 

--子表

delete test_fk1 where id='2';


--主表

update test_pk1 set id=55 where id='4';

delete test_pk1 where id='3';

insert into test_pk1 values(6,'F');


結論:子表上的delete操作執行後不提交,對主表上的update、delete、insert操作無影響。


場景四:主執行delete操作後不提交,另一個事務對子表進行update、delete、insert 

--主表

delete test_pk1 where id='3';


--子表

update test_fk1 set fcol='A' where id='1';

insert into test_fk1 values(4,'d');

delete test_fk1 where id='2';


結論:主表上的delete操作執行後不提交,對子表上的update、delete、insert操作無影響。


場景五:主執行update操作後不提交,另一個事務對子表進行update、delete、insert 

--主表

update test_pk1 set pcol='F' where id='5';


--子表

update test_fk1 set fcol='A' where id='1';

insert into test_fk1 values(4,'d');

delete test_fk1 where id='2';


結論:主表上的update操作執行後不提交,對子表上的update、delete、insert操作無影響。


場景五:主執行insert操作後不提交,另一個事務對子表進行update、delete、insert 

--主表

insert into test_pk1 values(6,'F');


--子表

update test_fk1 set fcol='A' where id='1';

insert into test_fk1 values(4,'d');

delete test_fk1 where id='2';


結論:主表上的delete操作執行後不提交,對子表上的update、delete、insert操作無影響。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2667077/,如需轉載,請註明出處,否則將追究法律責任。

相關文章