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