併發衝突
在多使用者的環境下,如果使用者同時修改同乙個文件,就會造成衝突。
典型的衝突有兩種:
1、丟失更新:乙個使用者的更新記錄覆蓋了另乙個人的更新。如:
使用者一:讀----------------------->寫
使用者二: 讀------>寫
那麼使用者一就把使用者二的更新覆蓋了。
2、髒讀:乙個使用者更新資料未完成時,另乙個使用者就讀取資訊。
使用者一:讀------------->寫
使用者二: 讀------------------------>
那麼使用者二讀取到的資料是舊的資料。
併發控制機制
既然存在這樣的衝突,就需要一種機制來處理併發衝突。最常見的方法就是加鎖,鎖又分樂觀鎖和悲觀鎖。
1、悲觀鎖:假定其他使用者企圖訪問或者改變你正在訪問、更改的物件的概率是很高的,因此在悲觀鎖的環境中,在你開始改變此物件之前就將該物件鎖住,並且直到你提交了所作的更改之後才釋放鎖。悲觀的缺陷是不論是頁鎖還是行鎖,加鎖的時間可能會很長,這樣可能會長時間的限制其他使用者的訪問,也就是說悲觀鎖的併發訪問性不好。
2、樂觀鎖:則認為其他使用者企圖改變你正在更改的物件的概率是很小的,因此樂觀鎖直到你準備提交所作的更改時才將物件鎖住,當你讀取以及改變該物件時並不加鎖。可見樂觀鎖加鎖的時間要比悲觀鎖短,樂觀鎖可以用較大的鎖粒度獲得較好的併發訪問效能。但是如果第二個使用者恰好在第乙個使用者提交更改之前讀取了該物件,那麼當他完成了自己的更改進行提交時,資料庫就會發現該物件已經變化了,這樣,第二個使用者不得不重新讀取該物件並作出更改。這說明在樂觀鎖環境中,會增加併發使用者讀取物件的次數。
選擇策略
在樂觀鎖和悲觀鎖之間進行
選擇的標準是:衝突的頻率與嚴重性。如果衝突很少,或者衝突的後果不會很嚴重,那麼通常情況下應該選擇樂觀鎖,因為它能得到更好的併發性,而且更容易實現。但是,如果衝突的結果對於使用者來說痛苦的,那麼就需要使用悲觀策略。
樂觀鎖的侷限是:只能在提交資料時才發現業務事務將要失敗,而且在某些情況下,發現失敗太遲的代價會很大。使用者可能花了乙個小時的時間輸入乙份租約的詳細資訊,錯誤太多會讓使用者對系統失去信心。另乙個方法是使用悲觀鎖,它可以盡早地發現錯誤,但理難以程式設計實現,而且會降低系統的靈活性。
樂觀鎖和悲觀鎖
1 悲觀鎖,正如其名,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制 也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無...
樂觀鎖和悲觀鎖
為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...
樂觀鎖和悲觀鎖
為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 l 丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。l 髒讀...