InnoDB的MVCC如何解決幻讀

2021-08-07 21:25:15 字數 601 閱讀 5296

innodb預設的隔離級別是rr(可重複讀),可以解決髒讀和不可重複讀,但是不能解決幻讀問題。

什麼是幻讀?

事務a讀取了乙個範圍內的資料,此時事務b在該範圍內插入了一條資料,並立馬提交了事務,此時事務a再次讀取這個範圍的資料時,發現多了一條,就好像幻覺一樣。

什麼是mvcc?

多版本併發控制。innodb為每行記錄新增了乙個版本號(系統版本號),每當修改資料時,版本號加一。

在讀取事務開始時,系統會給事務乙個當前版本號,事務會讀取版本號<=當前版本號的資料,這時就算另乙個事務插入乙個資料,並立馬提交,新插入這條資料的版本號會比讀取事務的版本號高,因此讀取事務讀的資料還是不會變。

例如:此時books表中有5條資料,版本號為1

事務a,系統版本號2:select * from books;因為1<=2所以此時會讀取5條資料。

事務b,系統版本號3:insert into books ...,插入一條資料,新插入的資料版本號為3,而其他的資料的版本號仍然是2,插入完成之後commit,事務結束。

事務a,系統版本號2:再次select * from books;只能讀取<=2的資料,事務b新插入的那條資料版本號為3,因此讀不出來,解決了幻讀的問題。

mvcc原理 Innodb的MVCC原理

該文章是 innodb的mvcc簡介 中的細節作出解釋。在mvcc出現之前的資料庫,為了實現一致性讀,如sqlserver,db2均採用鎖定讀技術,寫操作往往會阻塞讀操作,導致資料庫併發效能不高。oracle與postgre相繼推出自己的多版本併發控制技術,這一技術的核心是在發生讀寫衝突時候,讀操作...

innoDB的MVCC實現方式

innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現。乙個儲存行的建立時間,乙個儲存行的過期時間,儲存的值為系統版本號。每開啟乙個新的事務,系統版本號都會自動增加。在repeatable read隔離級別下,mvcc的具體操作 insert delete update 儲存這兩個額外系統...

簡述 InnoDB 對 MVCC 的實現

分為兩個要點簡述 要點一 行記錄的歷史版本是什麼樣子的?innodb 將行記錄及其歷史行記錄通過隱藏字段 data roll ptr 鏈成乙個鍊錶。歷史行記錄其實就是 undo log,放在共享表空間的 undo 段。要點二 當前事務進行快照讀時,如何選擇歷史版本?每個行記錄及其歷史行記錄都有乙個隱...