mysql事務隔離級別可重複讀與幻讀如何區分

mysql事務隔離級別

  • 讀未提交
    一個事務中變更的數據,雖然還未提交,在另一個事務中可以看到變更後的數據
  • 讀已提交
    當一個事務提交之後,該事務中變更的數據才能在其它事務中看到
  • 可重複讀
    同一事務中,同一查詢條件多次查詢,數據一致
  • 串行化
    在一個事務中訪問的行加鎖(讀寫鎖),其它事務出現鎖衝突,阻塞等待前面事務執行完成提交後,再繼續執行

mysql innodb引擎默認事務隔離級別

可重複讀

不同隔離級別出現的問題

  • 髒讀
    讀未提交情況下,事務A執行過程中讀取到了事務B中更新的數據,隨後事務B回滾了。
    不是重點,不說太多。基本也不用這個隔離級別,最少讀已提交。
  • 不可重複讀
    一個事務中,同一查詢條件語句,前後2次或多次執行查詢,查詢結果數據不一致。
    比如:select name from user where id = 1;
    在一個事務中第一次查詢,結果是張三,再進行一次查詢結果是李四。
  • 幻讀
    在一個事務中,2次或多次查詢(範圍查詢),結果行數不一致。
    如:select * from user where name=‘張三’;第一次2行,又查一次3行。
    或:select * from user where age >20 and age < 30,第一次查詢返回100行,第2次返回101行等。

不可重複讀與幻讀邊界

不可重複讀出現是因爲:一個事務,執行多次查詢的時候,查詢結果被另一個事務給修改了(另一個事務提交了,當前事務還需要再查詢一次),出現結果不一致
幻讀是因爲:事務A的範圍查詢結果,其它事務在這個範圍內增加相應行了,提交後被事務A看到,行數不一致
所以,注意,在可重複讀隔離級別下:幻讀僅指新插入行。第二,需要其它事務能看到,該級別一般查詢是快照讀,如果要被看到需要是當前讀(查詢後面加上for update,所有最新變更可以看到).避免幻讀需要再加間隙鎖,相關範圍區間加鎖,其它事務沒法新增記錄就是了(可重複讀級別,間隙鎖生效)。
同樣是結果不一致,區別在這裏。

p.s. 其實到我現在工作爲止,實際業務沒遇到過出現幻讀,概念還是要明白。

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