mysql多版本併發控制MVCC

事務隔離級別設置

set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //當前會話
複製代碼

修改事務提交方式(是否自動提交,mysql默認自動提交)

SET AUTOCOMMIT = 1; //自動提交,爲0手動提交
複製代碼

不一樣數據庫引擎MVCC模式各不相同,典型有樂觀和悲觀併發控制。

innodb
    說明:
        InnoDB的MVCC,是經過在每行記錄後面保存兩個隱藏的列來實現的。這兩個列,一個保存了行的建立時間,一個保存行的過時時間(或刪除時間)。固然存儲的並非實際的時間值,而是系統版本號(system version number).每開始個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會做爲事務的版本號,用來和查詢到的
    SELECT
    InnoDB會根據如下兩個條件檢查每行記錄:
        a. InnoDB只查找版本早於當前事務版本的數據行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣能夠確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插人或者修改過的。
        b.行的刪除版本要麼未定義,要麼大於當前事務版本號。這能夠確保事務讀取到的行,在事務開始以前未被刪除。
        只有符合上述兩個條件的記錄,才能返回做爲查詢結果。
    INSERT
        InnoDB爲新插人的每行 保存當前系統版本號做爲行版本號。
    DELETE
        InnoDB爲刪除的每行保存當前系統版本號做爲行刪除標識。
    UPDATE
        InnoDB爲插人行新記錄,保存當前系統版本號做爲行版本號,同時保存當前系統版本號到原來的行做爲行刪除標識。
    注意:
        MVCC只在REPEATABLE READ 和READ COMMITED 兩個隔離級別下工做。其餘兩個隔離級別都和MVCC不兼容法,由於READ UNCOMITTED老是讀取最新的數據行,而不是符合當前事務版本的數據行。而SERIALIZABLE則會對全部讀取的行都加鎖。
複製代碼

查看當表的狀態

show table status like 'task'\G;
複製代碼

髒讀、不可重複讀、幻讀

髒讀:當前事務讀到了另外一個事務未提交的狀態,事務沒有實現隔離。
不可重複讀:實現了事務的隔離性,但兩次讀取同一條數據的時候發現數據不一致了。
幻讀:兩次查詢同一批數據,發現有新數據被插入,主要是由於中途有其餘事務對數據集進行了插入操做。(加了間隙鎖解決該問題)
複製代碼
相關文章
相關標籤/搜索