Oracle中的鎖機制
?
??? 接著來學習一下Oracle的簡單管理操作,今天的內容是對鎖的學習。
Oracle中的鎖可以分為三類:DDL鎖、DML鎖、內部鎖。
基本上所有的鎖都可以由Oracle內部自動創建和釋放,但是其中的DDL和DML鎖是可以通過命令進行直接或者間接的管理的,只有內部鎖是必須有Oracle自動管理。下面分類學習一下:
?
?
1、內部鎖(Latch)--也叫閂
?
??? 由Oracle自動管理,以保護內部數據庫結構,例如數據文件等。比如Oracle要把用戶更新的數據寫入緩沖區,這時候Oracle就會在該緩沖區上加上latch,用來防止DBWR把他寫出到磁盤,因為如果沒有這個Latch,DBWR會把一半新一半老沒有用的數據寫到磁盤上。
?
2、DDL鎖
?
??? 在使用Create、Truncate、Alter時自動創建,以確保在執行過程中沒有其他事務對資源進行訪問。
?
3、DML鎖
?
??? DML鎖在事務開始時創建,在事務提交或回滾是釋放。ROLLBACK SAVEPOINT同。
?
?
鎖的模式
?
??? Oracle中的鎖可以分為以下幾種模式:共享鎖(S)、排他鎖(X)、行級共享鎖(RS)、行級排他鎖(RX)、共享行級排他鎖(SRX)
?
??? 其中RS鎖是限制最少的鎖,而X鎖是限制最多的鎖。相應的操作自動產生鎖的對應關系如下:
??? * INSERT、UPDATE、DELETE? --RX鎖
??? * CREATE? --S鎖
??? * ALTER? --X鎖
?
1、共享鎖(SHARE)
??? LOCK TABLE table_name IN SHARE MODE
?
??? 某事務使用S鎖鎖定表時,只允許其他事務使用S鎖鎖定該表,不能修改數據
?
2、排他鎖(EXCLUSIVE)
??? LOCK TABLE table_name IN EXCLUSIVE MODE
?
??? 某事務對表加了X鎖之后,不再允許其他事務鎖定該表
?
3、行級共享鎖(ROW SHARE)
??? LOCK TABLE table_name IN ROW SHARE MODE
?
??? 對相應行加上RS鎖后,仍然允許其他事務加RS鎖
?
4、行級排他鎖(ROW EXCLUSIVE)
??? LOCK TABLE table_name IN ROW EXCLUSIVE MODE
?
??? 對相應行加上RX鎖后,其他事務不能再對該表加鎖
?
5、共享行級排他鎖(SHARE ROW EXCLUSIVE)
??? LOCK TABLE table_name IN SHARE ROW EXCLUSIVE MODE
?
??? 對應行加X鎖,但對表加S鎖,所以可以讓別的事務對其他行加入X鎖
?
?
?
??? 具體的相容性如下表:
???
現有模式
|
請求鎖定
|
S
|
RS
|
RX
|
SRX
|
X
|
S
|
Y
|
Y
|
N
|
N
|
N
|
RS
|
Y
|
Y
|
Y
|
Y
|
N
|
RX
|
N
|
Y
|
Y
|
N
|
N
|
SRX
|
N
|
Y
|
N
|
N
|
N
|
X
|
N
|
N
|
N
|
N
|
N
|
?
?
?
?
鎖粒度
?
??? 鎖粒度是指被鎖定的數據對象大小。鎖粒度越大,能夠使用的資源就越少,并發度也越小,系統開銷也越小。
?
??? 數據庫中的鎖粒度分為4個級別:數據庫級、表級、行級、列級。注意Oracle不支持列級鎖!
?
??? 如果要在事務中處理大量記錄,則應該使用表級鎖,如果要處理多個大型表,則應該使用數據庫級鎖,如果都是少量數據,則使用行級。
?
1、TX鎖
?
??? TX鎖意即Transaction(事務鎖、行級鎖),改鎖從事務開始被創建,事務提交或回滾后釋放。
??? TX鎖可以鎖定事務所涉及到的所有數據行。
?
??? 事務鎖只有X鎖一種類型,而且是Oracle支持的最低級別的鎖。
?
2、TM鎖
?
??? TM鎖即表級鎖,它包括了所有的5種鎖模式。
?
??? 注意:因為Oracle在行級只提供X鎖,所以與RS鎖對應的行級鎖也是X鎖!
?
3、數據庫級鎖
?
??? 禁止任何新會話和新事務。主要是為了在沒有任何干擾情況下來完成對數據庫的維護。
?
??? 通常DBA將數據庫設置到限制性模式來鎖定它,在限制性模式中只允許RESTRICTED SESSION特權的的用戶登錄,命令如下:
?
??? ALTER SYSTEM ENABLE RESTRICTED SESSION;
?
??? 注:這個操作對于已經在數據庫中的SESSION將不起作用。
?
??? 也可以通過將數據庫設置到READ ONLY模式下來實現鎖定數據庫。
?
?
?
列舉了一些基礎,具體研究參閱《Oracle9i&10g編程藝術》第六章。
?
?