ITPub博客

首页 > 数据库 > Oracle > 无索引的外键之主表子表DML操作实验及结论

无索引的外键之主表子表DML操作实验及结论

原创 Oracle 作者:不一样的天空w 时间:2019-12-05 14:39:17 0 删除 编辑

子表上的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博客 ” ,链接:https://blog.itpub.net/31397003/viewspace-2667077/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-09-22

  • 博文量
    916
  • 访问量
    1400286