子表上的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操作无影响。
无索引的外键之主表子表DML操作实验及结论
来源:这里教程网
时间:2026-03-03 14:40:40
作者:
编辑推荐:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- db file sequential read等待事件
db file sequential read等待事件
26-03-03 - ORA-31693 & ORA-29913 & ORA-29401
ORA-31693 & ORA-29913 & ORA-29401
26-03-03 - windows7 安装与卸载 oracle 11G
windows7 安装与卸载 oracle 11G
26-03-03 - LIST INCARNATION OF DATABASE含义
LIST INCARNATION OF DATABASE含义
26-03-03 - 最佳实践 | 数据库迁云解决方案选型 & 流程全解析
最佳实践 | 数据库迁云解决方案选型 & 流程全解析
26-03-03 - Oracle date 类型比较和String比较
Oracle date 类型比较和String比较
26-03-03 - OPPO用户怎么让手机变流畅?花1分钟关闭这4个设置,瞬间变流畅
OPPO用户怎么让手机变流畅?花1分钟关闭这4个设置,瞬间变流畅
26-03-03 - 4 个概念,1 个动作,让应用管理变得更简单
4 个概念,1 个动作,让应用管理变得更简单
26-03-03 - 如何分析及处理 Flink 反压?
如何分析及处理 Flink 反压?
26-03-03 - 基于 Flink 的实时数仓生产实践
基于 Flink 的实时数仓生产实践
26-03-03
