這篇文章主要介紹了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不會自動建立索引,所以必須手動在與外來鍵約束相關的列上建立索引。所以我們這裡要研究的是否需要在子表中建立索引,因為父表中對應的列是一定有...