MySql 多本版併發控制 MVCC

2021-10-19 13:19:43 字數 2621 閱讀 3622

什麼是多版本併發控制

多版本併發控制技術的英文全稱是multiversion concurrency control,縮寫為mvcc。

多版本併發控制(mvcc)是通過在特定時間點儲存資料快照來實現的。 也就是說,無論事務執行多長時間,事務內部看到的資料都不會受到其他事務的影響。 根據事務的開始時間,每個事務可能同時看到同一表的不同資料。

簡而言之,多版本併發控制的思想是儲存資料的歷史版本,並通過管理資料行的多個版本來實現資料庫的併發控制。 通過這種方式,我們可以通過比較版本號來確定是否顯示資料。 在讀取資料時,我們不需要加鎖也能確保事務的隔離效果。  

可以認為多版本併發控制(mvcc)是行級鎖定的一種變體,但在許多情況下避免了鎖定操作,因此成本較低。 儘管實現機制不同,但是大多數實現非阻塞的讀操作,而寫操作僅鎖定必要的行。 

mysql中的大多數事務儲存引擎都不實現簡單的行級鎖。 為了提高併發效能,它們通常同時實施多版本併發控制(mvcc)。 mvcc不僅在mysql中實現,在oracle,postgresql和其他資料庫系統中也有實現。 但是,它們各自的實現機制是不同的,因為mvcc沒有統一的實現標準,通常包括樂觀併發控制和悲觀併發控制。

多版本併發控制解決了哪些問題

1,讀寫堵塞問題 

通過mvcc,讀取和寫入不能互相阻塞,即讀取不阻塞寫入和寫入不阻塞讀取,這可以提高事務併發處理的能力。

如何提高併發性

2.減少死鎖的可能性

由於innodb的mvcc採用了樂觀鎖定方法,因此在讀取資料時無需鎖定資料,而只有必要的行才被鎖定以進行寫操作。 

3.解決讀一致性問題

一致性讀取也稱為快照讀取,當我們在某個時間點查詢資料庫的快照時,我們只能看到此時間點之前事務提交更新的結果,而不能看到此時間點之後事務提交的結果。

快照讀和當前讀取(snapshot read and current read)

快照讀取這是一種無鎖的一致讀取,也是innodb併發效能比較優異的原因之一。 事務讀取的這些資料都是一致的:事務開始之前就存在的資料,以及事務本身插入或修改的資料。

不帶鎖的簡單select語句屬於快照讀取,例如:

`select * from t where id=1`

與快照讀相對應的是當前讀(current read),當前讀是讀取最新資料,而不是資料的歷史版本。 加鎖的select語句屬於當前讀取,例如:  

select * from t where id=1 lock in share mode;  

select * from t where id=1 for update;

innodb的mvcc如何工作1. innodb如何儲存記錄的多個版本

事務版本號

每次新建乙個事務時,我們將從資料庫中獲取事務d(即事務版本號)。 該事務id是自增長的。 通過id大小,我們可以確定事務的時間順序。

行記錄的隱藏列

innodb的葉子節點儲存資料頁,而資料頁儲存行記錄。 行記錄中有一些重要的隱藏字段:

db_row_id:6位元組的隱藏行id,用於生成預設的聚簇索引。 在這種情況下,當建立聚簇索引時,innodb將建立乙個隱藏索引列。 聚簇索引可以提高資料搜尋的效率。

db_trx_id:6位元組,運算元據的事務id,這是要插入或更新資料的最後乙個事務id。

db_roll_ptr:回滾指標。

innodb將行記錄的快照儲存在undo log中。 我們可以在回滾段中找到它們,如下圖所示:

從圖中可以看出,回滾指標通過鍊錶的結構連線資料行的所有快照記錄,並且每個快照都會記錄事務建立的時間(事務的id也就是該資料的操作點)。 這樣,如果我們要查詢歷史快照,可以通過遍歷回滾指標來找到它。

2.innodb不可重複讀隔離級別在mvcc中如何工作 

查詢 (select)

innodb根據以下兩個條件檢查記錄的每一行:

只有滿足以上兩個條件的記錄才能作為查詢結果返回。插入

innodb將當前系統版本號儲存為每個新插入的行的行版本號。刪除

innodb將每個刪除行的當前系統版本號儲存為行刪除識別符號。 刪除在內部被視為更新,並且行中的特殊標記位設定為刪除。更新

為了插入新記錄,innodb將當前系統版本號儲存為行版本號,並將當前系統版本號儲存到原始行中作為行刪除識別符號。

總結

多版本併發控制(mvcc)在一定程度上實現了讀寫併發性,它只有不可重複的讀和讀已提交這兩個隔離級別下。 其他兩個隔離級別與mvcc不相容,因為未提交讀,總是讀取最新的資料行,而不是與當前事務版本匹配的資料行。而序列化則是要上鎖。

行鎖,併發,事務回滾和許多其他功能都與mvcc有關。

PostgreSQL 多版本併發控制MVCC

什麼是mvcc?mvcc,multi version concurrency control,多版本併發控制,mvcc就是用同乙份資料臨時保留多版本的方式,實現併發控制。它可以避免讀寫事務之間的互相阻塞,相比通常的封鎖技術可極大的提高業務的併發效能。如果有人從資料庫中讀資料的同時,有另外的人寫入資料...

Mysql多版本併發控制

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

MySQL 架構 多版本併發控制

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