【深入理解數據庫原理】InnoDB 是如何解決幻讀、不可重複讀?

InnoDB 是如何解決幻讀、不可重複讀?

如何解決不可重複讀

上一篇文章,已經說明 InnoDB 是如何解決不可重複讀的。
一個事務只在第一次 SELECT 的時候會獲取一次 Read view,而後面所有的 SELECT都會複用這個 Read view,這樣每次讀到的就是一樣的,就可重複讀。

可重複讀

InnoDB 是如何解決幻讀的?

在讀已提交的情況下,及時採用了 MVCC 方式也會出現幻讀,如果我們同時開啓事務A 和 事務B, 現在事務A 中進行某個條件的查詢,讀取的時候採用排他鎖,在事務B 中增加一條複覈該條件範圍的數據,並提及,然後事務A中再查詢該條件範圍的數據,就會發現結果集中多了一條數據,這樣便出現了幻讀。

幻讀場景

InnoDB 行鎖方式

  • 記錄鎖:針對單個行記錄加鎖
  • 間隙鎖:(Gap Locking):可以幫助啊我們鎖住一個範圍(索引之間的空隙),但是不包括記錄本身。
  • Next-Key :幫我們鎖住一個範圍,同時鎖住記錄本身。

InnoDB 是採用 Next-key 鎖機制,解決幻讀。

當我們想要插入球員艾利克斯·倫(身高2.16米)的時候,事務B會超時,無法插入該數據。這是因爲採用了 Next-Key 鎖,會將 height>2.08的範圍都進行鎖定,就無法插入符合這個範圍的數據了。然後事務A重新進行條件範圍的查詢,就不會出現幻讀的情況。

MVCC的核心就是 Undo log+ Read view,“MV”就是通過 Undo log來保存數據的歷史版本,實現多版本的管理,“CC”是通過 Read view來實現管理,通過 Read view原則來決定數據是否顯示。同時針對不同的隔離級別, Read view的生成策略不同,也就實現了不同的隔離級別。

程序員開發者社區

程序員開發者社區

150講輕鬆搞定Python網絡爬蟲

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