oracle死鎖原因分析 轉

2021-06-16 11:00:44 字數 2130 閱讀 2194

死鎖的原因

1。模擬死鎖

1。1。主表

-- create table

create table wdz1

(wdz1id number not null,

memo   varchar2(20));

alter table wdz1

add constraint ****** primary key (wdz1id);

1。2。從表(沒有外健的索引)

-- create table

create table wdz2

(wdz2id number not null,

wdz1id number,

memo   varchar2(20));

-- create/recreate primary, unique and foreign key constraints

alter table wdz2

add constraint ***xx primary key (wdz2id)

;alter table wdz2

add constraint *** foreign key (wdz1id)

references wdz1 (wdz1id);

1。3。插入資料表到住表

begin

insert  into wdz1 values (1,'aa');

insert  into wdz1 values(2,'aa2');

insert  into wdz1 values (3,'aa3');

insert into wdz2 values(10,3,'wdz3--1');

commit;

end;

1。4。在乙個資料庫seeesion裡面插入數到從表,但是不提交事務

begin

update wdz2  set memo='update wdz2 momo'

where wdz2id=10;

insert into wdz2 values(20,2,'wdz2--1');

end;

對從表進行插入/修改記錄,施加的鎖也就是行級鎖

1。5。在另外乙個資料庫seeesion裡面刪除 主表資料

delete from wdz1 where wdz1id=1

這時候 程式會死鎖,除非 上面的 對從表的 資料操作提交事務或者回滾事務。

2。具體原因分析

乙個資料表的外來鍵主要有3種方式來維護它自己和主表資料的一致性。

(1)delete cascade

例子如下:

alter table wdz2

add constraint *** foreign key (wdz1id)

references wdz1 (wdz1id) on delete cascade;

(2)set null

例子如下:

alter table wdz2

add constraint *** foreign key (wdz1id)

references wdz1 (wdz1id) on delete set null;

(3)no action

注意,這是oracle外來鍵使用時候的預設選項。

例子如下:

alter table wdz2

add constraint *** foreign key (wdz1id)

references wdz1 (wdz1id);

以前出現死鎖主要是我們認為,在 1。4。會對資料表wdz2進行施加行級鎖,但是從表(wdz2)的外健是no action,刪除主表(wdz1)不會去訪問從表,更不會去鎖定 wdz2表的記錄或者對整個資料從表(wdz2)施加表級鎖。事實上 oralce的no action 選項的字面意思欺騙了我們,oracle在刪除主表的時候

會去尋找所有以主表的主鍵作為外來鍵的資料表,然後看去看從表

是否有該外來鍵的索引,如果沒有則會對整個從表施加表級鎖,然後

對從表進行全表掃瞄。當然如果從表存在外來鍵的索引,會去訪問

對應的索引,而不會對從表本身進行加鎖。

3。解決辦法

為從表的外來鍵建立索引,這也是在使用外來鍵的推薦方式。

這樣就能避免上面出現的問題了。

文章**

oracle 常見死鎖原因。

資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有衝...

HashMap死鎖原因分析及原理

一 hashmap原理 1.hashmap的本質就是陣列和鍊錶。table是乙個entry陣列,每乙個陣列元素儲存乙個entry節點,而entry節點內部又連線著同樣key的下乙個entry節點,就構成了鍊錶。詳情見 hashmap原始碼分析 2.hashmap死鎖原因 hashmap會造成死鎖,因...

死鎖的條件 原因以及場景分析

死鎖可以稱為程序死鎖。那麼是在多程序 併發 情況下可能會出現的。指的是多個程序因為競爭資源而造成的僵局 互相等待 沒有外力,那麼所有程序都會無法向前推進。所以是在作業系統和併發程式設計中需要特別考慮的問題。因此,可以可以得出如下的場景和必備條件。場景 四大必要條件 死鎖預防 打破之前四個條件 死鎖避...