1、併發環境下資料庫可能出現的四種情況:
(1)丟失更新:兩個事務同時對同乙份資料進行修改,其中乙個事務的修改被另外乙個事務覆蓋;
(2)髒讀:事務a對資源t進行了更新,事務b讀到了更新後的t,但事務a卻rollback導致更新無效(此時b讀到的t是髒的);
(3)不可重複讀:事務a讀取資源t,在a結束之前,多次讀取t的結果應該是一致的。如果在a多次讀取t的間隔中,事務b更新了t,就會導致a多次讀取的內容不一致;
(4)幻讀:在乙個事務中多次讀取記錄,卻因為其他事務的修改,導致多次讀取的結果不一致。(聽起來和「不可重複讀」差不多,實際完全是兩回事,比如,事務a讀取庫中value=5的記錄數目,第一次讀可能查到6條,這時事務b又插入了一條,事務a再次讀就變成了7條;和(3)的區別在於幻讀不涉及到共享資源的爭奪(事務b可能是新插入記錄或刪除記錄))。
2、資料庫中的兩種鎖:排它鎖、共享鎖
鎖機制可以解決共享資源的爭奪問題。
(1)排它鎖:又稱為寫鎖(x)。若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其它任何事務都不能再對a加任何型別的鎖,直到t釋放a上的鎖。這就保證了其它事務在t釋放a上的鎖之前不能再讀取和修改a。
(2)共享鎖:又稱為讀鎖(s)。若事務t對資料物件a加上s鎖,則其它事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這就保證了其它事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。
3、封鎖協議
對什麼時候申請x鎖或s鎖、持鎖時間、何時釋放做一些規則和限制,共有**封鎖協議,不同的封鎖協議可以解決的併發問題也不一樣。
在文章下面的引用中對三種協議的概念做了詳細的闡述,在此不做贅述,直接給出三種協議可以解決的問題。
(1)一級封鎖協議:可以解決「丟失更新」的問題;
(1)二級封鎖協議:解決「丟失更新」和「髒讀」;
(1)**封鎖協議:解決「丟失更新」、「髒讀」、「不可重複讀」;
4、隔離機制
隔離機制為程式設計師節省了許多時間,不需要自己去實現封鎖協議,主要有以下四種機制,不用的機制解決不同程度的併發問題:
(1)readuncommitted:實現了一級封鎖協議
(2)readcommitted:實現了二級封鎖協議
(3)repeatableread:實現了**封鎖協議
(4)serializable:在**協議的基礎上做了補充,限制的更加嚴格,主要解決了「幻讀」的問題(其它三種問題當然也都解決了)。
建議大家對各種協議的實現過程做一些了解,下面的引用寫的很全面:
另外,對併發環境下的四種問題,可以參考以下文章(對封鎖協議和隔離機制的講解,建議參考上面的鏈結):
資料庫隔離機制的實現
資料庫隔離機制的實現 總結糾正個問題 資料資料庫隔離機制 序列化可重複讀 讀已提交 讀未提交 資料庫事務可能導致的問題 髒讀不可重複讀幻讀 髒讀 事務a,先執行,處於未提交的狀態 insert into table values 1,xx 事務b,後執行,也未提交 select from table...
資料庫鎖機制實現隔離
面對高併發加鎖可以從兩種層面來考慮 下面介紹 樂觀鎖 悲觀鎖 共享鎖s和排他鎖x 區別 1.樂觀鎖 從上面的例子可以看出,樂觀鎖機制避免了長事務中的資料庫加鎖開銷 操作員 a和操作員 b 操作過程中,都沒有對資料庫資料加鎖 大大提公升了大併發量下的系統整體效能表現。需要注意的是,樂觀鎖機制往往基於系...
資料庫事物 隔離等級及資料庫鎖機制
事務 transaction 是資料庫管理系統的執行單位,可以是乙個資料庫操作 如select操作 或者是一組操作序列。事務acid屬性,即原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性 atomic 保證事務中的所有操作...