臟讀、不可重復讀、幻讀(虛讀)


事務並發下出現的問題

臟讀: (讀取了未提交的新事物,然后被回滾了)MySQL不支持臟讀

  臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。

  事務A讀取了事務B中尚未提交的數據。如果事務B回滾,則A讀取使用了錯誤的數據。

  比如我給你轉了100萬,但是我還沒有提交,此時你查詢自己賬戶,多了100萬,很開心。然后我發現轉錯人了,回滾了事物。然后你100萬就沒了。  在過程中你查到了沒有提交事物的數據(多出的100萬),這就是臟讀。

不可重復讀: (讀取了提交的新事物,指更新操作)

  不可重復讀是指在對於數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。
  不可重復讀和臟讀的區別是:臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了前一事務提交的數據。
  在某些情況下,不可重復讀並不是問題,比如我們多次查詢某個數據當然以最后查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如同一個事物前后兩次查詢同一個數據,期望兩次讀的內容是一樣的,但是因為讀的過程中,因為令一個數據寫了該數據,導致不可重復讀。

幻讀:(也是讀取了提交的新事物,指增刪操作)幻讀也是虛讀

  幻讀是事務非獨立執行時發生的一種現象。幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數據,而幻讀針對的是一批數據整體(比如數據的個數)。

   幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。 同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那么,以后就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象 發生了幻覺一樣。例如,一個編輯人員更改作者提交的文檔,但當生產部門將其更改內容合並到該文檔的主復本時,發現作者已將未編輯的新材料添加到該文檔中。 如果在編輯人員和生產部門完成對原始文檔的處理之前,任何人都不能將新材料添加到文檔中,則可以避免該問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM