主要介紹了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;
不可重複讀:實現了事務的隔離性,但兩次讀取同一條資料的時候發現資料不一致了。髒讀、不可重複讀、幻讀
髒讀:當前事務讀到了另一個事務未提交的狀態,事務沒有實現隔離。
幻讀:兩次查詢同一批資料,發現有新資料被插入,主要是因為中途有其他事務對資料集進行了插入操作。(加了間隙鎖解決該問題)
以上就是本文的全部內容,希望對大家的學習有所幫助,