InnoDB中的MVCC機制

    在進行多事務,併發讀寫的管理時,Mysql的InnoDB引擎採用的是Multiversion Concurrency Control機制,MVCC機制也被其他數據庫所採用。每種引擎實現MVCC機制的具體細節不同,但大體思想類似。因此瞭解其思想,結合場景去應用。

1、MVCC機制是行級鎖的一種妥協,多線程事務讀取時,避免使用鎖,而是採用一種更小的開銷,允許非阻塞讀取,寫操作進行時只鎖定必要的記錄

2、簡單的實現方式:MVCC保存某個時間點上的數據快照。一個事務內,看到的是同一個版本的快照,數據一致。不同事務在同一時間點看到的數據會不一致,因爲他們得到的數據版本不一樣。InnoDB在每一行記錄添加兩個額外的隱藏值,分別記錄創建時間,和過期(或者刪除)時間,這裏的時間並不是真正意義上的時分秒,而是事件發生時數據庫記錄的系統版本號。

(1)每個事務創建時,Innodb的系統版本號會增加,而事務會記錄這個作爲自己的版本號,如上所述,每條數據庫記錄會保存兩個版本號,一個是創建,一個是過期。當進行查詢操作時,遵循兩個原則:
     a.滿足查詢條件的記錄,其創建版本號必須不大於事務版本,這樣保證數據是事務開始前創建
        b.過期版本必須是未定義或者大於事務版本,開始後才過期,這樣的數據是可讀的。
(2)當一個事務修改了數據之後,數據的版本號會變化。其他事務就不會讀取修改後的數據,因爲和它們創建時獲取的版本號不一致。
insert:InnoDB爲這個新行記錄當前的系統版本號;
delete:InnoDB將當前的系統版本號設置爲這一行的刪除ID;
update:InnoDB會寫一個這行數據的新拷貝,這個拷貝爲當前的系統版本號。同時將這個版本號寫到舊行的過期時間中
(3)優點在於,大多數查詢不需要獲取額外的鎖。但是Innodb會爲每一行存儲多個版本的數據。原理類似於copyonwrie
(4)可以解決髒讀和不可重複讀的問題,但是解決不了幻讀的問題。髒讀就是,事務A讀取一個事務B沒提交的數據,然後事務B回滾了。MVCC保證事務A讀取的肯定是上一個版本的。不可重複讀也是同理,事務A只讀取其創建時的版本數據,其他事務對數據的修改只會得到新的版本數據。幻讀解決不了是因爲事務A更新所有數據,而事務B插入數據,但是由於版本問題事務A不能更新新插入的數據。

 

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