資料庫是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。
加鎖是實現資料庫併發控制的乙個非常重要的技術。當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。
在資料庫中有兩種基本的鎖型別:排它鎖(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語句並沒有任何影響;
引用:http://blog.csdn.net/sfdev/archive/2008/01/13/2042325.aspx
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...