學習筆記 | Mysql事務併發隔離級別

不同的隔離級別:

01 Read Uncommitted 讀取未提交內容
  • 最低的隔離級別,什麼都不需要做,一個事務可以讀到另一個事務未提交的結果。
  • 所有的併發事務問題都會發生。
  • 讀取未提交的數據,也被稱之爲髒讀(Dirty Read)
02 Read Committed 讀取提交內容
  • 只有在事務提交後,其更新結果纔會被其他事務看見。
  • 可以解決髒讀問題。
03 Repeated Read 可重複讀
  • 在一個事務中,對於同一份數據的讀取結果總是相同的,無論是否有其他事務對這份數據進行操作,以及這個事務是否提交。
  • 可以解決髒讀、不可重複讀。
04 Serialization 可串行化
  • 事務串行化執行,隔離級別最高,犧牲了系統的併發性。
  • 可以解決併發事務的所有問題。

事務併發安全問題

一、髒讀

  • 髒讀指的就是髒數據,一個事務並未提交的數據便是髒數據。

二、不可重複讀

  • 一個事務在執行期間無論重複讀取多少次數據,返回的結果都應該與第一次讀取到的數據一致,如果不一致,那便意味着發生了不可重複讀的安全問題。
  • 同時操作,事務一分別讀取事務二操作時和提交後的數據,讀取的記錄內容不一致

例子:

  • 事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便得到了不同的結果。

三、幻讀

  • 幻讀側重的是整行的數據變化,如果一個事務在執行期間讀取到的結果數量不相同,那就說明讀取到了幻影數據,發生了幻讀問題。

  • 和可重複讀類似,但是事務二的數據操作僅僅是插入和刪除,不是修改數據,讀取的記錄數量前後不一致。

    例子:

  1. 在事務1中,查詢User表id爲1的是用戶否存在,如果不存在則插入一條id爲1的數據。
  2. 在事務1查詢結束後,事務2往User表中插入了一條id爲1的數據。
  3. 此時,由於事務1查詢到id爲1的用戶不存在,因此插入1條id爲1的數據。
  4. 但是由於事務2已經插入了1條id爲1的數據,因此此時會報主鍵衝突,對於事務1 的業務來說是執行失敗的,這裏事務1 就是發生了幻讀。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章