什麼是多版本併發控制
多版本併發控制技術的英文全稱是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;innodb的mvcc如何工作1. innodb如何儲存記錄的多個版本select * from t where id=1 for update;
事務版本號
每次新建乙個事務時,我們將從資料庫中獲取事務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...