mysql innoDB 的MVCC工作原理

mysql爲每行數據添加了兩個隱藏的字段,一個爲保存創建版本號,一個保存刪除版本號,版本號根據時間是遞增的。
那麼我們看下mysql在REPEATABLE READ隔離級別下,MVCC是如何操作的;
我們模擬一張表:

create table tbl(
    create_no int,
    delete_no int
);

-- 假設事物的版本號 no = 20200525001;
-- insert 操作:創建版本號 = 當前事物版本號;
    insert into tbl (icreate_no,delete_no) values (no,null);
-- delete 操作:刪除版本號 = 當前事物版本號;
    update tbl set delete_no =no;
-- update 操作:
    -- 插入一行數據 創建版本號 = 當前事物版本號;
    insert into tbl (icreate_no,delete_no) values (no,null);   
    -- 更細原來行數據  刪除版本號 = 當前事物版本號;
    update tbl set delete_no =no;
-- select操作:
select
    *
from
    tbl
where
    create_no <= no and delete_no is nll or delete_no > no ;
-- 註釋說明
    -- 創建版本號<=當前事物版本號 (這樣可以確保當前事物讀取的行要麼是在本事物中創建和修改的要麼就是當前事物開始前就存在的行)
    -- 並且 刪除版本號 is null 或者 刪除版本號 >  當前事物版本號 (這樣可以確保讀到的行是當前事物開始前沒有被刪除);


有了這兩個版本號,使大多數情況下的讀操作可以不用加鎖,這樣設計的可以使讀操作簡單,性能也很好,並且能保證讀到符合的行,不足之處就是每行記錄都需要額外的空間存貯空間,需要更多的行堅持工作和一些額外的維護工作。

-- 注意 
    MVCC只在  REPEATABLE READ 和 REND CONNITTED 兩個隔離級別下工作,其他的兩個隔離級別下不兼容。 讀未提交總是讀取最新的數據行,而不符合當前事物版本的數據行。而序列化則會對所有的讀取的行都加鎖。

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