無索引的外來鍵之主表子表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全文索引之commit與DML操作Oracle索引MIT
- 10.30 索引,外來鍵索引
- hyperf關聯子表查詢主表資料
- oracle點陣圖索引對DML操作的影響Oracle索引
- oracle 主外來鍵關係及實驗Oracle
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用ENQ索引
- oracle外來鍵約束的總結Oracle
- 外來鍵欄位未建索引引發的死鎖索引
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- SQL外來鍵約束的含義及建立SQL
- MYSQL的外來鍵MySql
- 實現 MongoDB 外來鍵關聯MongoDB
- 資料結構實驗之圖論二:圖的深度遍歷資料結構圖論
- oracle之 反向鍵索引Oracle索引
- 外來鍵的變種
- 主鍵和外來鍵
- sqlserver外來鍵SQLServer
- 聊聊Oracle外來鍵約束(Foreign Key)的幾個操作選項Oracle
- 【MySQL】gh-ost改雙主表結構主鍵衝突問題MySql
- indexedDB 內鍵與外來鍵Index
- 新的主鍵和外來鍵的語法
- F - 資料結構實驗之圖論六:村村通公路資料結構圖論
- 外來鍵約束
- MySQL的DDL和DML操作語法MySql
- 通過外來鍵找主鍵
- 大數量的DML時對索引處理的技巧索引
- Mac常用操作及快捷鍵Mac
- Oracle 檢視可以DML操作的條件Oracle
- mysql索引使用經驗總結MySql索引
- Entity Framework 實體載入外來鍵屬性的問題Framework
- SQLServer DML操作阻塞SELECT查詢SQLServer
- DDL、DML、DCL、DQL相關操作
- Sysbench-0.5改成只有DML操作
- Android鍵盤操作總結Android
- 資料結構實驗5、鏈佇列的基本操作資料結構佇列
- ClickHouse主鍵索引最佳實踐索引