<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
MVCC(Multiversion Concurrency Control),多版本並行控制。它和undo log中的版本鏈息息相關,MVVC通過資料行的多個版本來實現資料庫的並行控制。
簡單的說就是當前事務查詢另一個事務正在更改的行(如果此時讀取就會發生髒讀),不用加鎖等待,而是讀取該資料的歷史版本,降低響應時間。
MVVC是通過undo log和Read View兩種技術實現的。
MVCC在MySQL InnoDB中的實現主要是為了提高資料庫並行效能,用更好的方式去處理讀-寫衝突,做到即使有讀寫衝突時,也能做到不加鎖,非阻塞並行讀 ,而這個讀指的就是快照讀 , 而非當前讀。當前讀實際上是一種加鎖的操作。
當前讀讀取的記錄一定是最新的資料,讀取時還要保證其他並行事務不能修改當前記錄,會對讀取的記錄進行加鎖。
加鎖的讀被稱為當前讀,還有資料的增刪改都是要先讀取資料的,這一讀取過程也是當前讀。
SELECT * FROM t LOCK IN SHARE MODE; # 共用鎖 SELECT * FROM t FOR UPDATE; # 排他鎖 UPDATE SET t..
快照讀又叫一致性讀,讀取的是資料行的快照版本。在MySQL中,普通的select語句(不加for update或lock in share mode的select語句)預設就是使用的快照讀,不加鎖。
SELECT * FROM table WHERE ...
之所以這樣,是因為快照讀可以避免加鎖操作,降低開銷。
當事務的隔離級別是序列時,快照讀就沒有用了,會退化為當前讀。
隔離級別:
在MySQL中預設的隔離級別就是可重複讀RR,可以解決不可重複讀問題,在MySQL中,特別的還額外支援解決幻讀問題。
它是如何解決幻讀問題的呢?有兩種方式:
undo log版本鏈:
對應InnoDB來說,聚簇索引中的每個記錄都包含了兩個必要的隱藏欄位:
舉例:
有一個id為8的事務建立了一條資料,那麼該記錄的示意圖大概如下:
假設之後兩個id分別為10、20的事務對這條記錄進行update操作,流程如下:
事務10 | 事務20 |
---|---|
BEGIN; | |
BEGIN; | |
UPDATE student SET name='李四' WHERE id=1; | |
UPDATE student SET name='王五' WHERE id=1; | |
COMMIT; | |
UPDATE student SET name='趙六' WHERE id=1; | |
UPDATE student SET name='錢七' WHERE id=1; | |
COMMIT; |
每次修改都會生成一個undo log紀錄檔,每個紀錄檔都相互連結,構成版本鏈,此時該條資料的示意圖如下:
每個版本中還包含生成該版本時對應的事務id 。
有了undo log就可以讀取到記錄的歷史版本,那麼在什麼情況下,讀取哪個版本的記錄呢?這就用到了Read View,它幫我們解決了行的可見性問題。
Read View就是當某個事務在使用MVVC機制進行快照讀操作時產生的讀檢視。該檢視是資料庫當前所有活躍事務id(還未提交的事務)組成的列表的一個快照。
四種隔離級別裡,讀未提交和序列化是不會使用MVVC的,因為讀未提交直接讀取某個資料的最新資料即可,序列化是通過加鎖來讀的。
讀已提交和可重複讀都必須保證讀到的資料都是其他事務提交了的,所以,其他事務修改了資料但是還未提交,我們不能夠存取該資料,但可以通過MVVC機制讀取該記錄的歷史版本,核心問題就是需要判斷版本鏈中的哪條歷史版本是當前事務可見的,這也是ReadView要解決的問題。
Read View包含4個比較重要的內容:
只有事務對錶中的記錄做修改時才會為事務分配事務id,否則一個事務中只有讀操作,該事務的id預設為0。
注意:low_limit_id並不是trx_ids中的最大值,事務id是遞增分配的。比如,現在有id為1, 2,5這三個事務,之後id為5的事務提交了。那麼一個新的讀事務在生成ReadView時, trx_ids就包括1和2,up_limit_id的值就是1,low_limit_id的值就是6。
版本鏈
當某個事務有了Read View,存取某條記錄時,需要按照下面的步驟判斷該記錄的哪個版本可見:
瞭解了這些概念之後,我們來看下當查詢一條記錄的時候,系統如何通過MVCC找到它:
在隔離級別為讀已提交時,一個事務中的每一次SELECT查詢都會重新獲取一次Read View,而可重複讀是第一SELECT操作才會生成Read View,之後的查詢操作複用這一個。
導致這兩種的差距是因為:可重複讀要保證一個事務中相同的SELECT讀取的內容是相同的。
COMMITTED隔離級別下
現在有兩個事務id分別為10、20的事務在執行:
-- id為10的事務 begin; update t set name='李四' where id=1; update t set name='王五' where id=1; -- id為20的事務 更新其他行的資料
此刻,表中id為1的記錄得到的版本連結串列如下所示:
此時新來一個事務執行如下操作:
begin; select * from t where id=1; -- 事務10、20未提交
查詢到的結果為張三。
具體的過程如下:
接下來,再將id為10的事務進行commit提交。然後id為20的事務來更新記錄:
begin; -- id為20的事務 update t set name='趙六' where id=1; update t set name='錢七' where id=1;
此時版本鏈更新為:
再到剛才使用READ COMMITTED隔離級別的事務中繼續查詢這個id 為1的記錄,得到的結果為name=王五的那條記錄。執行過程如下:
注意:READ COMMITTED,每次讀取資料前都生成一個新的ReadView。
假如此時id為10的事務和id為20的事務正在修改,都未提交,修改內容和前面的一樣,但是還未提交,此時當前事務做一個查詢。
步驟為:
此時,id為10的記錄提交事務。
當前事務又需要select id為1的記錄,步驟為:
注意:REPEATABLE READ,每次讀取都複用第一次生成的Read View
假設現在有一條資料,id為1
當前活躍的事務有10和20。
此時當前事務啟動了,執行如下SQL語句:
begin; select * from student where id>=1;
在開始前生成Read View,內容如下:creator_trx_id=0,trx_ids= [10,20] , up_limit_id=10, low_limit_id=21。
由於id大於等於1的資料只有一個,且該資料的trx_id為8,小於up_limit_id,所以可以讀取到。
在這之後id為10的事務新增了一行資料,增加了id為2的資料,且提交了。
此時當前執行緒繼續查詢id>=1的資料,因為是可重複讀,複用剛剛的Read View。
得到兩行資料,但是因為id為2的資料trx_id為10,該值在Read View的trx_ids中存在,所以該記錄對當前事務不可見,所以最後查詢到的資料只有一條記錄。
如果當前事務再插入id為2的資料就插不進去,所以說MVVC只解決了一半的幻讀問題。
到此這篇關於MySQL MVVC多版本並行控制的實現詳解的文章就介紹到這了,更多相關MySQL MVVC內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45