文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

子表上的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操作无影响。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯