併發控制 簡單總結

2021-09-23 20:58:16 字數 2209 閱讀 3602

預期讀者

1. 初學者。

2. 想複習的人。

3. 原來學習併發覺得太複雜,沒搞清楚,想以更簡單的方式學習的人。

4. 懶得總結的人。

下面,我就以乙個比較簡單的方式來總結,和你們分享。:)

目標

併發控制要做的是協調併發事務的執行,保證資料完整不受破壞,同時避免使用者得到不正確的資料。主要目標有以下兩個:

1. 保證事務的特性:acid(automicity,consistency,isolation,durability)。不再贅述。

2. 盡量多的併發數。

問題

併發操作如果不加任何控制,則可能存在以下的問題:

1.丟失更新。(「寫」到「完」之間有另一人「寫」)

2. 讀過時的資料。(「讀」到「完」之間有另一人「寫」)

3. 讀的資料。(「寫」到「撤」之間有另一人「讀」)

括號裡面的語句,使用比較接近本質的現象,來給前面的問題進行簡單的描述或定義。

鎖機制

併發控制的主要方法是採用封鎖技術:

要解決問題1和3,我們需要在寫的時候,不讓其他人有任何的許可權。這就設計出了第一種鎖:排他型鎖(x封鎖)。這種鎖只允許乙個事務獨享資料,其實事務只有等這個事務解除封鎖後,才能對資料進行任何型別的封鎖。

要解決問題2,我們需要在讀的時候,不讓其他人有寫的許可權。這就有了第二種鎖:共享型鎖(s封鎖)。我們可以理解為:排寫型鎖。

這樣一看,其實就是我們常用的讀寫鎖,這是net下我比較喜歡用的讀寫鎖類:執行緒同步:system.core中新的讀寫鎖。

封鎖協議

一級封鎖協議。「事務t在修改資料r之前必須先對其加x鎖,走到事務結束才釋放。一級封鎖協議可防止丟失更新,並保證事務t是可恢復的。但不能保證可重複讀和不讀髒資料。」。解決了1,沒解決2、3,這是因為沒有對讀的事務進行任務控制。

二級封鎖協議。「一級封鎖協議上加上事務t在讀取資料r之前對其加s鎖,讀完後即可釋放s鎖。二級封鎖協議可防止丟失更新,還可防止讀髒資料。但不能保證可重複讀。」。解決了1、3,沒解決2,這是因為讀後就釋放,到事務完之前的這段時間有可能被寫。

**封鎖協議。「一級封鎖協議上加上事務t在讀取資料r之前對其加s鎖,走到事務結束後才釋放。**封鎖協議可防止丟失更新、防止讀髒資料與資料可重複讀。」。解決1,2,3,這是因為它彌補了二級封鎖協議的缺點。

兩段封鎖協議。「所有事務必須分兩個階段對資料項加鎖和解鎖。其中擴充套件階段是在對任何資料進行讀、寫操作之前,首先要申請並獲得對該資料的封鎖;收縮階段是在釋放乙個封鎖之後,事務不能再申請和獲得任何其他封鎖。若併發執行的所有事務均遵守兩段協議,則對這些事務的任何併發高度策略都是可序列化的(可以避免丟失更新、不可重複讀和讀髒資料等問題)。遵守兩段封鎖協議的事務可能會發生死鎖」。解決了1,2,3,卻可能會死鎖原因:「序列化」方案自然可以解決與之含義相反的「併發」所帶來的問題,但是同時因為它其實已經不是併發了,所以也就不可能達到第二個目標:「高併發」。死鎖發生在兩個事務在擴充套件階段都想要申請對方已經擁有的資源。

結束語

上面的併發方案是比較基礎型的,所以並未提及應用級別的樂觀鎖、悲觀鎖等。從問題出發,理解鎖的設計原理,再理解封鎖協議的設計原理,可以讓我們在應用的時候,根據不同的情況,選擇不同的鎖機制和封鎖協議以滿足不同的需求。這個才是最終的目的

因為打算明年試試去考乙個職稱,再加上也想紮實一下一些很有用的基礎知識,所以最近開始看《系統架構設計師考試全程指導》這本書。中途學到併發時,感覺很難想明白為什麼會有這些鎖,為什麼會有這些協議,為什麼每個協議就可以解決這些特定的問題。所以花了些時間研究了下,寫出來和大家分享。上面許多原因是基於我的理解,如果不對的話,歡迎拍磚,並指出錯誤的原因。謝謝。:)

併發控制 簡單總結

預期讀者 1.初學者。2.想複習的人。3.原來學習併發覺得太複雜,沒搞清楚,想以更簡單的方式學習的人。4.懶得總結的人。下面,我就以乙個比較簡單的方式來總結,和你們分享。目標 併發控制要做的是協調併發事務的執行,保證資料完整不受破壞,同時避免使用者得到不正確的資料。主要目標有以下兩個 1.保證事務的...

linux 併發控制總結

atomic t atomic t atom atomic init 1 atomic dec and test atom atomic inc atom spin lock t spinlock t lock spin lock init lock define spinlock lock spi...

mysql 併發控制 mysql併發控制

mysql併發控制 當有多個查詢需要同時修改同乙個資料,就會產生併發控制的問題。mysql可以在兩個層面進行併發控制 伺服器層和儲存引擎層。mysql通過加鎖實現併發控制 鎖有兩類 讀鎖 共享鎖,即乙個讀鎖不會阻塞其它讀鎖,多個使用者可同時讀取同乙個資源,而不互相干擾。寫鎖 排他鎖,即乙個寫鎖會阻塞...