數據庫事務中不可重複讀與幻讀的區別

開門見山

可重複讀僅能保證再次執行同樣的查詢時,先前返回【過】的結果一定跟之前一樣,而不保證會不會多出別的記錄。如果返回了之前沒有出現過的記錄,就是幻讀。

隔離級別

數據庫事務的四種隔離級別相信現在已經爛大街了,但是發現很多文章都沒有解釋清楚不可重複讀non-repeatable read與幻讀phantom的區別,所以這裏總結明確一下。

  • 讀未提交(Read Uncommitted)

    這個非常好理解,就是在一個事務中可以讀到其他事務還沒有提交的中間值,相當於沒有隔離。

  • 提已提交(Read Committed)

    相對於上一條而言,此級別在一個事務中只允許讀到其他事務已經提交過的值,看不到其他事務的中間值。但這樣也有問題,就是在同事務中前後兩次select有可能會返回不同的結果,即第一次select以後,如果中間有其他事務提交了對相關數據的修改,那麼第二次select就會看到新的值,與第一次select不一致。術語"不可重複讀"指的就是這種情況,重複讀即多次select, 不可重複讀就是多次select的結果可能是不一樣的。

  • 可重複讀(Repeatable Read)

    容易混淆的地方就在這了。可重複讀這一級別保證了在同一個事務中,第一次select到的數據,在後續select中仍然保持不變。重點在於,它保證的是對於第一次讀到的數據,後續再對這些數據的讀操作會返回相同的結果。它的問題在於範圍查詢。比如第一次讀到了A, B兩條記錄,那麼可重複讀僅能保證再執行同樣的查詢時,返回的A, B記錄跟之前的一樣,而不保證其他記錄。這裏的其他記錄是指在兩次查詢之間有其他事務在中間插入了新記錄,這些新記錄剛好與你的where條件匹配,這樣一來雖然第二次查詢也返回了跟之前一樣的A, B,但可能會多了C, D, E等新記錄,這就叫幻讀

  • 串行化

    沒啥好說的。

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