Mysql多版本併發控制

2021-10-02 18:28:51 字數 1157 閱讀 9713

mysql的絕大多數事務型儲存引擎都不是簡單的行級鎖。他們實現了多版本的併發控制,也就是mvvc,當然,支援mvvc的資料庫並不只有mysql,orcale、postgresql等都實現了mvvc,只不過他們實現的方式不同而已,因為mvvc沒有乙個統一的規範。

其實mvvc可以理解為行級鎖的一種變異,它會選擇性加鎖,避免的大部分情況下的枷鎖操作,所以節省了cpu的開銷,雖然每個資料庫的實現方式不同,但都是併發讀,序列寫(必要的記錄)。

mvvc是通過儲存資料在某個時間點的快照實現的,也就是說,不管執行多少**,多長時間,每個事務看到的資料應該是一致的。如果沒有mvvc,根據mysql的隔離級別,我們會發現,不同的事務之間,每個事務查詢到的資料可能是不一致的,對這點不清晰的可以參考:事務特徵以及隔離級別。

雖然說不同的儲存引擎有著不同的實現mvvc方式,但是最經典的莫過於樂觀併發控制以及悲觀併發控制,我們來說明一下他們分別如何實現併發控制。

innodb儲存引擎是通過在每行記錄的後面保留兩個字段(隱藏),這兩列,乙個是儲存了行的建立時間,喲i個是儲存過期時間(刪除時間)。當然,儲存的並不是真是的時間值,而是系統版本號,每開啟乙個事務,系統的版本號都會疊加,整個事務都會一當前的版本號作為判斷的基本條件。

查詢:innodb會根據下面兩個條件查詢每行記錄:

1.innodb之查詢版本號小於或等於當前事務版本號的資料行。

2.資料的刪除版本要麼沒有指定,要麼必須大於當前事務版本號,可以保證事務讀取到的資料在事務開啟之前未被刪除。

插入:innodb再插入的時候會在新行中儲存當前系統的版本號作為行版本號。

刪除:innodb將需要刪除的資料儲存當前系統版本號作為刪除表示。

修改:innodb未插入一行新紀錄,儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行作為刪除標識。

儲存這兩個額外的版本號,就可以讓大多數讀操作可以不加鎖,提高了系統效能,並且也能保證只會督導符合標準的記錄,但是這兩個欄位會占用額外的儲存空間。

悲觀併發控制其實就很簡單了,那就是鎖定指定行,同一時刻,只有乙個事務能被執行,其他食物處於阻塞狀態,這樣訊息並不是很好,但是不需要新增額外的字段。

mvvc只在read committed(讀提交)與repeatable read(可重複讀)兩個隔離級別下工作,至於是什麼原因,如果閱讀了上面的事務特徵以及隔離級別,相信就不難理解了。

MySQL 架構 多版本併發控制

大部分的mysql的儲存引擎,比如innodb,falcon,以及pbxt並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高併發的技術,被稱為mvcc 多版本併發控制 mvcc並不單單應用在mysql中,其他的資料庫如oracle,postgresql,以及其他資料庫也使用這個技術。mvcc...

mysql多版本併發控制MVCC

innodb的mvcc是通過在每行記錄的後面儲存兩個隱藏的列來實現的,這兩個列乙個儲存行的建立時間,乙個儲存行的過期時間。但是並不是儲存時間而是儲存版本號,每開始乙個新的事務,版本號會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到每行記錄的版本號進行比較。select innod...

mysql多版本併發控制MVCC

set global transaction isolation level read committed 全域性的 set session transaction isolation level read committed 當前會話 複製 set autocommit 1 自動提交,為0手動提交...