Oracle外來鍵不加索引會引起死鎖問題

2022-01-29 11:07:44 字數 1594 閱讀 6212

這篇文章主要介紹了oracle外來鍵不加索引引起死鎖的情況及解決,需要的朋友可以參考下

--建立乙個表,此表作為子表

create table fk_t as select * from user_objects;

delete from fk_t where object_id is null;

commit;

--建立乙個表,此表作為父表

create table pk_t as select * from user_objects;

delete from pk_t where object_id is null;

commit;

--建立父表的主鍵

alter table pk_t add constraint pk_pktable primary key (object_id);

--建立子表的外來鍵

alter table fk_t add constraint fk_fktable foreign key (object_id) references pk_t (object_id);

--session1:執行乙個刪除操作,這時候在子表和父表上都加了乙個row-s(sx)鎖

delete from fk_t where object_id=100;

delete from pk_t where object_id=100;

--session2:執行另乙個刪除操作,發現這時候第二個刪除語句等待

delete from fk_t where object_id=200;

delete from pk_t where object_id=200;

--回到session1:死鎖馬上發生

delete from pk_t where object_id=100;

session2中報錯:

sql> delete from pk_table where object_id=200;

delete from pk_table where object_id=200

* 第 1 行出現錯誤:

ora-00060: 等待資源時檢測到死鎖

當對子表的外來鍵列新增索引後,死鎖被消除,因為這時刪除父表記錄不需要對子表加表級鎖。

--為外來鍵建立索引

create index ind_pk_object_id on fk_t(object_id) nologging;

--重複上面的操作session1

delete from fk_t where object_id=100;

delete from pk_t where object_id=100;

--session2

delete from fk_t where object_id=200;

delete from pk_t where object_id=200;

--回到session1不會發生死鎖

delete from pk_t where object_id=100; 

關於外來鍵不加索引引起死鎖的詳細分析參考

經過驗證,如果外來鍵不加索引的確會出現死鎖。因此,外來鍵務必新增索引。

(基礎知識)Oracle中外鍵不加索引?

oracle中外鍵不加索引可能會導致3個問題,這裡的外來鍵包括oracle所有種類的外來鍵 普通外來鍵 級聯外來鍵和置空外來鍵 1。1.死鎖以及併發問題。對於父表的delete update操作都會導致子表鎖定 表級鎖 這指的是發起指令到指令結束這一段過程中,會鎖表。這個全表鎖可能會導致死鎖2,以及...

Oracle 主鍵外來鍵唯一索引索引

1.查詢索引 select table name,index name from user indexes where table name upper test temp1 2.建立主鍵 1 建立表的時候建立 create table test temp1 id int primary key,n...

Oracle外來鍵需要建索引嗎?

關於oracle中的外來鍵,首先要說明一下。1.除非已定義了父表主鍵或唯一鍵約束,否則oracle將不允許建立子表的外來鍵約束。2.在定義外來鍵約束時,oracle不會自動建立索引,所以必須手動在與外來鍵約束相關的列上建立索引。所以我們這裡要研究的是否需要在子表中建立索引,因為父表中對應的列是一定有...