無索引的外來鍵之主表子表DML操作實驗及結論
子表上的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 外來鍵沒有索引哪些DML操作會被阻塞索引
- oracle foreign key外來鍵_更新主表對於子表三種行為控制Oracle行為控制
- 關於主外來鍵關係DML父表和DML子表加鎖方式
- 通過在Oracle子表外來鍵上建立索引提高效能Oracle索引
- 主表子表動態欄位儲存實現方式總結
- 【fk_index】外來鍵中有無索引的區別Index索引
- 父表修改與外來鍵的關係(主鍵DML與外來鍵的關係)
- 表外來鍵未加索引之處理索引
- 基於v$lock.lmode分析父子表外來鍵列是否索引持鎖模式區別之系列六索引模式
- 外來鍵有無索引帶來的影響學習與測試索引
- oracle全文索引之commit與DML操作Oracle索引MIT
- 10.30 索引,外來鍵索引
- 查詢外來鍵約束、子表欄位等資訊的SQLSQL
- 【實驗】【外來鍵】小議外來鍵約束對應用程式的影響
- 查詢沒有索引的外來鍵索引
- 分析user_constraints為何不顯示子表外來鍵列構建的索引歷險記AI索引
- hyperf關聯子表查詢主表資料
- 關於外來鍵的理解和實驗步驟
- oracle 主外來鍵關係及實驗Oracle
- 外來鍵缺索引檢查指令碼索引指令碼
- 檢查外來鍵是否有索引的指令碼索引指令碼
- 在已存在的表結構上新增主鍵、外來鍵、聯合主鍵、聯合索引的例子索引
- Oracle 外來鍵索引影響阻塞問題Oracle索引
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- 【實驗】【索引壓縮】索引壓縮演示及優缺點總結索引
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用ENQ索引
- oracle外來鍵約束的總結Oracle
- oracle點陣圖索引對DML操作的影響Oracle索引
- 主外來鍵約束之主表插入未提交導致外來鍵表插入hang住的等待事件 TX-row lock contention事件
- 清理Oracle中無用索引改善DML效能Oracle索引
- 清除Oracle中無用索引 改善DML效能Oracle索引
- 清除Oracle中無用索引,改善DML效能Oracle索引
- oracle查詢表資訊(索引,外來鍵,列等)Oracle索引
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用(上)ENQ索引
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用(下)ENQ索引
- SQL外來鍵約束的含義及建立SQL
- 修改外來鍵為validate時需要驗證資料是否符合外來鍵約束
- MYSQL的外來鍵MySql