數據庫鎖機制

一 、樂觀鎖和悲觀鎖

【悲觀鎖】
所謂悲觀鎖就是基於數據庫機制實現的。
比如在在使用select子句的時候加上for update,
那麼直到改子句的事務結束爲止,任何應用都無法修改select出來的記錄。

【樂觀鎖】
所謂樂觀鎖是基於應用的版本機制來實現的。
數據庫中帳戶信息表中有一個 version字段,當前值爲1;而當前帳戶餘額字段(balance)爲$100。 
1、操作員A 此時將其讀出(version=1),並從其帳戶餘額中扣除$50 ($100-$50)。 
2、在操作員A操作的過程中,操作員B也讀入此用戶信息(version=1),並從其帳戶餘額中扣除$20($100-$20)。 
3、操作員A完成了修改工作,將數據版本號加一(version=2),連同帳戶扣除後餘額(balance=$50),提交至數據庫更新,此時由於提交數據版本大於數據庫記錄當前版本,數據被更新,數據庫記錄version更新爲2。 
4、操作員B完成了操作,也將版本號加一(version=2)試圖向數據庫提交數據(balance=$80),但此時比對數據庫記錄版本時發現,操作員B提交的數據版本號爲2,數據庫記錄當前版本也爲2,不滿足“提交版本必須大於記錄當前版本才能執行更新“的樂觀鎖策略,
因此,操作員B 的提交被駁回。這樣就避免了操作員B 用基於version=1 的舊數據修改的結果覆蓋操作員A的操作結果的可能。
樂觀鎖機制避免了長事務中的數據庫加鎖開銷(操作員A 和操作員B操作過程中,都沒有對數據庫數據加鎖),大大提升了大併發量下的系 統整體性能表現。

樂觀鎖、悲觀鎖 是從是否鎖數據方面進行分類。

共享鎖、排它鎖是從 鎖的類型進行分類。

轉載:http://blog.sina.com.cn/s/blog_548bd2090100ir7k.html

讀鎖 寫鎖 共享鎖 排它鎖 悲觀鎖 樂觀鎖

二、排它鎖和共享鎖
在數據庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。
當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。
數據庫利用這兩種基本的鎖類型來對數據庫的事務進行併發控制。

三、表級鎖和行級鎖
DML鎖的目的在於保證併發情況下的數據完整性,主要包括TM鎖和TX鎖,其中TM鎖稱爲表級鎖,TX鎖稱爲事務鎖或行級鎖。
當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得後,系統再自動申請TX類型的鎖,並將實際鎖定的數據行的鎖標誌位進行置位。
這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標誌,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。
TM鎖包括了SS、SX、S、X等多種模式,在數據庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。


2 SS(ROW-S)行級共享鎖
其他對象只能查詢這些數據行 SELECT FOR UPDATE、LOCK FOR UPDATE、
LOCK ROW SHARE
3 SX(ROW-X) 行級排它鎖
在提交前不允許做DML操作 INSERT、UPDATE、DELETE、

轉載:http://blog.sina.com.cn/s/blog_95b5eb8c0101i22x.html

其他概念:鎖的多粒度性以及鎖升級 

重入鎖

sql組成:
DDL:數據庫模式定義語言,關鍵字:create
DML:數據操縱語言,關鍵字:Insert、delete、update
DCL:數據庫控制語言 ,關鍵字:grant、remove
DQL:數據庫查詢語言,關鍵字:select

死鎖 活鎖 飢餓鎖

死鎖的預防

死鎖的解決


發佈了217 篇原創文章 · 獲贊 39 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章