髒讀!幻讀!不可重複讀!mysql併發事務引發的問題

loopyhz發表於2024-09-19

髒讀!幻讀!不可重複讀!mysql併發事務引發的問題

併發事務引發的三個問題

①髒讀

髒讀(Dirty Read) 是資料庫事務隔離級別中的一種現象。它發生在兩個事務併發執行時,一個事務能夠讀取到另一個事務尚未提交的修改。

髒讀的具體情況

  1. 事務A 對某個資料進行了修改,但尚未提交。
  2. 事務B 在事務A提交之前讀取了該資料的修改結果。
  3. 如果此時事務A發生回滾(撤銷未提交的更改),那麼事務B讀取到的實際上是一個無效的、更改後被撤銷的資料。因為事務A的更改最終沒有被提交,所以事務B讀到的資料是不正確的,稱為“髒資料”。

不可重複讀

是指在一個事務中多次讀取同一條資料時,讀取的結果不一致,因為在兩次讀取之間,另一事務對該資料進行了修改並提交。 一個事務中可以進行多次讀取,比如這個事務開始的時候讀取一次,結束的時候讀取一次。兩次讀取的結果不一樣,這個就是不可重複讀

不可重複讀的具體情況

  1. 事務A 在第一次讀取某條記錄時,得到了一個值。
  2. 事務B 在事務A的第一次讀取和第二次讀取之間,對該記錄進行了更新並提交了修改。
  3. 事務A 在第二次讀取時,發現同一條記錄的資料已經發生了變化,和第一次讀取的結果不一致。

這種情況就是所謂的“不可重複讀”,因為事務A無法在整個事務中多次讀取到相同的結果。

幻讀

是一種事務併發問題,發生在一個事務(事務A)執行了多次相同的查詢時,發現結果集中出現了新的“幻影”行,即記錄的數量發生了變化,通常是因為另一個事務(事務B)在這期間插入或刪除了資料。

幻讀的具體情況:

  1. 事務A 執行了一次查詢,獲得了一個結果集。
  2. 事務B 在事務A的查詢之後,插入了符合事務A查詢條件的新資料或刪除了部分資料,並提交了事務。
  3. 事務A 再次執行同樣的查詢時,結果集中包含了事務B插入的“新”資料,或者缺少了事務B刪除的資料。

這就是幻讀現象,因為事務A無法保證每次查詢的結果集保持一致。

相關文章