數據庫併發與併發異常

寫在前面:博主是一只經過實戰開發歷練後投身培訓事業的“小山豬”,暱稱取自動畫片《獅子王》中的“彭彭”,總是以樂觀、積極的心態對待周邊的事物。本人的技術路線從Java全棧工程師一路奔向大數據開發、數據挖掘領域,如今終有小成,願將昔日所獲與大家交流一二,希望對學習路上的你有所助益。同時,博主也想通過此次嘗試打造一個完善的技術圖書館,任何與文章技術點有關的異常、錯誤、注意事項均會在末尾列出,歡迎大家通過各種方式提供素材。

  • 對於文章中出現的任何錯誤請大家批評指出,一定及時修改。
  • 有任何想要討論和學習的問題可聯繫我:[email protected]
  • 發佈文章的風格因專欄而異,均自成體系,不足之處請大家指正。

數據庫併發與併發異常

本文關鍵字:髒讀、髒寫、更新丟失、不可重複讀、幻讀


在使用數據庫來支撐業務系統時,隨着用戶量的增大,經常會遇到同時讀取相同數據的情況,在沒有進行併發控制的情況下就會遇到各種各樣的問題,對於可能出現的問題我們要有所瞭解。

一、什麼是併發

併發指的是在同一時間,有多個程序都處在啓動運行到運行完畢之間的狀態,並且都在同一個處理機上運行。
對於數據庫來說,數據庫併發指的就是在同一時間內,有多個事務都處在開始到提交之間的狀態,並都在同一個數據庫服務中。

二、常見併發異常

有關於事務的特性可參考前一篇文章:數據庫事務與特性。假設不做任何的併發控制,讓那些對數據的操作自由執行,將會遇到下列的問題:

1. 髒讀

髒讀指的是一個事務A在運行時讀取了另一個失敗事務B未提交的數據,這就導致事務B回滾後,事務A讀取到了一個與數據庫記錄衝突的錯誤數據。

數據庫中某條數據的money值爲20,在處理過程中,事務B修改值爲100,隨後被事務A讀取,接下來事務B因爲其他環節的錯誤導致回滾,money的值被還原爲20,這時事務A所讀取的數據即爲髒數據(錯誤數據)。

2. 髒寫

髒寫指的是一個事務A一同回滾了另外一個事務B已經提交的數據,這將導致事務B已經執行成功的操作一同被回滾。

事務B先於事務A執行成功,但隨後事務A回滾,將事務B的提交內容一同回滾。

3. 更新丟失

更新丟失指的是事務A與事務B均提交成功,但是由於讀取和寫入的時間點問題,導致事務B的修改結果好像未生效一樣。

最初數據庫中money的值爲20,在事務B提交成功後money的值爲40,按正常邏輯事務A將money的值減去20,結果應爲20,但對事務A來說讀取到的值爲20,導致最後結果爲0

4. 不可重複讀

不可重複讀指的是由於另外一個事務B對數據的操作,導致事務A前後兩次讀取到的結果不一致。與髒讀的主要區別是:一個讀取的是已經被回滾的數據,一個讀取的是已經成功提交後的數據,但前後並不一致。

5. 幻讀

幻讀指的是讀取某個範圍的數據時,因爲有其他事務的操作導致前後兩次的查詢結果不同。不可重複讀與幻讀的主要區別在於不可重複讀是一條具體數據的不一致,幻讀是對一組數據的前後不一致。

在事務B執行前,事務A得到的結果集爲:1,3,4,7,在事務B插入一個新的賬戶:8後,事務A得到的結果集爲:1,3,4,7,8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章