oracle的鎖機制

2021-08-31 04:22:41 字數 3937 閱讀 3876

鎖是一種機制,是用來管理對乙個共享資源的並行訪問。

解停? 只有對資源進行並行訪問時才會用到鎖,但單個戶模式下的資料庫是不需要鎖的。所以鎖的目的就是在多個使用者並行訪問資料庫時為了保證資料的一致和準確性採用的一種保護機制。幾乎所有的資料庫都採用了鎖的機制,但其實現機制卻有很大的卻別。oracle在鎖的處理上較sybase和informix有著明顯的優勢,特別是在行級鎖的處理上,基本上算是完美。

封鎖問題:

乙個典型的程式設計缺陷例子。

a:使用者1檢索到一行資料,並準備修改。

b:使用者2檢索到相同的資料。

c:使用者2刪除了這一行,並提交。

d:使用者修改那一行,並提交,結果程式報錯,該行不存在。

使用者抱怨開發商,開發商認為是使用者人為因素造成。

分析:當使用者1通過程式從資料庫中提取出自己想要修改的記錄時,該記錄並沒有鎖定,此時使用者2用同樣的條件檢索到該行,並刪除,提交導致該行不復存在,此時使用者1對檢索到的行修改後提交時,由於該行已經被刪除,導致使用者操作失敗。從而對軟體失去信心。

解決方法:

在對該行進行修改之前,對該行鎖定,防止其他人對該行進行dml操作。select * from tab for update nowait;

此時資料庫將在該行上建立乙個行級排它鎖,直到等到乙個commit或者rollback時才釋放。

一、悲觀封鎖

鎖在使用者修改之前就發揮作用:

select ..for update(nowait)

select * from tab1 for update

使用者發出這條命令之後,oracle將會對返回集中的資料建立行級封鎖,以防止其他使用者的修改。

如果此時其他使用者對上面返回結果集的資料進行dml或ddl操作都會返回乙個錯誤資訊或發生阻塞。

1:對返回結果集進行update或delete操作會發生阻塞。

2:對該錶進行ddl操作將會報:ora-00054:resource busy and acquire with nowait specified.

原因分析

此時oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些資料進行的修改或刪除操作都必須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生阻塞,這個這個操作commit或rollback.

同樣這個查詢的事務將會對該表加表級鎖,不允許對該錶的任何ddl操作,否則將會報出ora-00054錯誤::resource busy and acquire with nowait specified.

二、樂觀封鎖

樂觀的認為資料在select出來到update進取並提交的這段時間資料不會被更改。這裡面有一種潛在的危險就是由於被選出的結果集並沒有被鎖定,是存在一種可能被其他使用者更改的可能。因此oracle仍然建議是用悲觀封鎖,因為這樣會更安全。

阻塞定義:

當乙個會話保持另乙個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。4個常見的dml語句會產生阻塞

insert

update

delete

select…for update

insert

insert發生阻塞的唯一情況就是使用者擁有乙個建有主鍵約束的表。當2個的會話同時試圖向表中插入相同的資料時,其中的乙個會話將被阻塞,直到另外乙個會話提交或會滾。乙個會話提交時,另乙個會話將收到主鍵重複的錯誤。回滾時,被阻塞的會話將繼續執行。

update 和delete當執行update和delete操作的資料行已經被另外的會話鎖定時,將會發生阻塞,直到另乙個會話提交或會滾。

select …for update

當乙個使用者發出select..for update的錯作準備對返回的結果集進行修改時,如果結果集已經被另乙個會話鎖定,就是發生阻塞。需要等另乙個會話結束之後才可繼續執行。可以通過發出 select… for update nowait的語句來避免發生阻塞,如果資源已經被另乙個會話鎖定,則會返回以下錯誤:ora-00054:resource busy and acquire with nowait specified.

死鎖-deadlock

定義:當兩個使用者希望持有對方的資源時就會發生死鎖.

即兩個使用者互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲乙個使用者作為代價,另乙個使用者繼續執行,犧牲的使用者的事務將回滾.

例子:1:使用者1對a表進行update,沒有提交。

2:使用者2對b表進行update,沒有提交。

此時雙反不存在資源共享的問題。

3:如果使用者2此時對a表作update,則會發生阻塞,需要等到使用者一的事物結束。

4:如果此時使用者1又對b表作update,則產生死鎖。此時oracle會選擇其中乙個使用者進行會滾,使另乙個使用者繼續執行操作。

起因:oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程式設計造成的,經過調整後,基本上都會避免死鎖的發生。

鎖的分類

按封鎖的物件可以分成:

dml lock

ddl lock

dml lock

dml鎖是用來保護資料在被並行訪問時資料的安全和一致性,按照限制級別的高低依次可以分成以下幾種:

1:rowlock(tx)

dml:insert,update,delete ,select …for update.

這些操作會在所操作的行上建立排它鎖,直到所在的事物提交或會滾才釋放。

2:table-lock(tm )

當乙個事物在進行dml操作時,所在的事務會對所操作的表加表級鎖,以保證在這個事務過程中表不被改變。

表級鎖按照限制等級可以分成以下幾類:

3:rs

row share table lock

以下的操作會產生rs lock

select * from tab for update.

lock table table in row share mode;

rs不允許的操作

lock table table in exclusive mode;

4:rx

row exclusive table locks

以下的操作會產生rs lock

1:insert,update ,delete

2:lock table table in row exclusive mode;

rx不允許的操作

lock table table in share mode;

lock table table in share exclusive mode;

lock table table in exclusive mode;

5:sshare table locks

以下操作產生s lock.

lock table table in share mode;

s不允許的操作

lock table table in share row exclusive mode;

lock table table in exclusive mode;

lock table table in row exclusive mode;

srxshare row exclusive table locks

以下操作產生srx lock

lock table table in share row exclusive mode;

srx不允許的操作.

lock table table in share mode;

lock table table in share row exclusive mode;

lock table table in row exclusive mode;

lock table table in exclusive mode;

xexclusive table locks

一下操作產生x lock

lock table table in exclusive mode;

x不允許的操作

不允許所有的操作

ORACLE的鎖機制

設立封鎖機制主要是為了對併發操作進行控制,對干擾進行封鎖,保證資料的一致性和準確性。oracle資料庫封鎖方式有三種 共享封鎖,獨佔封鎖,共享更新封鎖 oracle rdbms的封鎖型別可分為如下三類 內部級封鎖 內部級封鎖是用於保護oracle內部結構,由系統內部實現,使用者不能訪問,因此我們不必...

ORACLE的鎖機制

設立封鎖機制主要是為了對併發操作進行控制,對干擾進行封鎖,保證資料的一致性和準確性。oracle資料庫封鎖方式有三種 共享封鎖,獨佔封鎖,共享更新封鎖 oracle rdbms的封鎖型別可分為如下三類 內部級封鎖 內部級封鎖是用於保護oracle內部結構,由系統內部實現,使用者不能訪問,因此我們不必...

Oracle鎖的機制。

設立封鎖機制主要是為了對併發操作進行控制,對干擾進行封鎖,保證資料的一致性和準確性。oracle資料庫封鎖方式有三種 共享封鎖,獨佔封鎖,共享更新封鎖 oracle rdbms的封鎖型別可分為如下三類 內部級封鎖 內部級封鎖是用於保護oracle內部結構,由系統內部實現,使用者不能訪問,因此我們不必...