ORACLE高階之二 LOCK

2021-04-14 15:28:55 字數 2479 閱讀 1424

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。

加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。

在資料庫中有兩種基本的鎖型別:排它鎖(exclusive locks,即x鎖)和共享鎖(share locks,即s鎖)。當資料物件被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的資料物件可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖型別來對資料庫的事務進行併發控制。

根據保護的物件不同,oracle資料庫鎖可以分為以下幾大類:

dml鎖(data locks,資料鎖),用於保護資料的完整性;

ddl鎖(dictionary locks,字典鎖),用於保護資料庫物件的結構,如表、索引等的結構定義;

內部鎖和閂(internal locks and latches),保護資料庫的內部結構,應用於sga;

在我們實際應用開發中涉及較多的是dml鎖,其他兩種的話dba會更加關心點;

dml鎖的目的在於保證併發情況下的資料完整性,主要包括tm鎖和tx鎖,其中tm鎖稱為表級鎖,tx鎖稱為事務鎖或行級鎖。

當oracle執行dml語句時,系統自動在所要操作的表上申請tm型別的鎖。當tm鎖獲得後,系統再自動申請tx型別的鎖,並將實際鎖定的資料行的鎖標誌位進行置位。這樣在事務加鎖前檢查tx鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查tm鎖模式的相容性即可,大大提高了系統的效率。tm鎖包括了ss、sx、s、x等多種模式,在資料庫中用0-6來表示。不同的sql操作產生不同型別的tm鎖。如下圖所示: 

值鎖模式

鎖描述sql

0none

1null

空select

2ss(row-s)

行級共享鎖

其他物件只能查詢這些資料行

select for update、lock for update、

lock row share

3sx(row-x)

行級排它鎖

在提交前不允許做dml操作

insert、update、delete、

lock row share

4s(share)

共享鎖create index、lock share

5ssx(s/row-x)

共享行級排它鎖

lock share row exclusive

6x(exclusive)

排它鎖alter table、drop table、drop index、

truncate table、lock exclusive

在資料行上只有x鎖(排他鎖)。在 oracle資料庫中,當乙個事務首次發起乙個dml語句時就獲得乙個tx鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行dml語句時,第乙個會話在該條記錄上加鎖,其他的會話處於等待狀態。當第乙個會話提交後,tx鎖被釋放,其他會話才可以加鎖。

在大概了解oracle的鎖機制之後,我們來解決幾個基本的問題:

1.update/delete操作會將rs鎖定,直至操作被commit或者rollback;

若操作未commit之前其他session對同樣的rs做變更操作,則操作會被hold,直至前session的update/delete操作被commit;

2.session內外select的rs範圍

前提:insert、update操作未commit之前進行select;

若在同一session內,select出來的rs會包括之前insert、update影響的記錄;

若不在同一session內,select出來的rs不會包括未被commit的記錄;

3.select.... for update [of cols] [nowait/wait] [skip locked]

of cols:只鎖定指定字段所在表的rs,而沒有指定的表則不會鎖定,只會在多表聯合查詢時出現;

nowait:語句不會hold,而是直接返回錯誤ora-00054: resource busy and acquire with nowait specified;

wait n:語句被hold n秒,之後返回錯誤ora-30006: resource busy; acquire with wait timeout expired;

skip locked:不提示錯誤,而是直接返回no rows selected;

以上幾個選項可以聯合使用的,比較推薦的有:

select.... for update nowait:對同一rs執行該sql時,直接返回錯誤;

select.... for update nowait skip locked:對同一rs執行該sql時,直接返回空行;

ps:當rs被lock住之後,只對同樣請求lock的語句有效,對無需lock的select語句並沒有任何影響; 

ORACLE高階之二 LOCK

資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖...

Oracle效能優化二Lock

沒有併發就沒有鎖,為了保證事務的正確邏輯 enqueues 佇列型別的鎖,通常和業務相關 latches 系統資源方面的鎖,比如內部結構,sql解析 latches門栓 通過下面這條查詢可以列出所有鎖 select type,name from v lock typetm鎖,發生在insert,up...

Oracle 基礎之二

執行三 select 列名稱 列 列名稱 列 執行一 from 表名稱 別名 執行二 where 過濾條件 限定符號 查詢工資大於2000的人員 select from emp where sal 2000 查詢allen的資訊 secelt from emp where ename allen a...