成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

mysql的MVCC多版本并發控制的實現

瀏覽:243日期:2023-10-03 18:51:30
1 什么是MVCC

MVCC全稱是: Multiversion concurrency control,多版本并發控制,提供并發訪問數據庫時,對事務內讀取的到的內存做處理,用來避免寫操作堵塞讀操作的并發問題。

舉個例子,程序員A正在讀數據庫中某些內容,而程序員B正在給這些內容做修改(假設是在一個事務內修改,大概持續10s左右),A在這10s內 則可能看到一個不一致的數據,在B沒有提交前,如何讓A能夠一直讀到的數據都是一致的呢?

有幾種處理方法,第一種: 基于鎖的并發控制,程序員B開始修改數據時,給這些數據加上鎖,程序員A這時再讀,就發現讀取不了,處于等待情況,只能等B操作完才能讀數據,這保證A不會讀到一個不一致的數據,但是這個會影響程序的運行效率。還有一種就是:MVCC,每個用戶連接數據庫時,看到的都是某一特定時刻的數據庫快照,在B的事務沒有提交之前,A始終讀到的是某一特定時刻的數據庫快照,不會讀到B事務中的數據修改情況,直到B事務提交,才會讀取B的修改內容。

一個支持MVCC的數據庫,在更新某些數據時,并非使用新數據覆蓋舊數據,而是標記舊數據是過時的,同時在其他地方新增一個數據版本。因此,同一份數據有多個版本存儲,但只有一個是最新的。

MVCC提供了 時間一致性的 處理思路,在MVCC下讀事務時,通常使用一個時間戳或者事務ID來確定訪問哪個狀態的數據庫及哪些版本的數據。讀事務跟寫事務彼此是隔離開來的,彼此之間不會影響。假設同一份數據,既有讀事務訪問,又有寫事務操作,實際上,寫事務會新建一個新的數據版本,而讀事務訪問的是舊的數據版本,直到寫事務提交,讀事務才會訪問到這個新的數據版本。

MVCC有兩種實現方式,第一種實現方式是將數據記錄的多個版本保存在數據庫中,當這些不同版本數據不再需要時,垃圾收集器回收這些記錄。這個方式被PostgreSQL和Firebird/Interbase采用,SQL Server使用的類似機制,所不同的是舊版本數據不是保存在數據庫中,而保存在不同于主數據庫的另外一個數據庫tempdb中。第二種實現方式只在數據庫保存最新版本的數據,但是會在使用undo時動態重構舊版本數據,這種方式被Oracle和MySQL/InnoDB使用。

2、InnoDB的MVCC實現機制

MVCC可以認為是行級鎖的一個變種,它可以在很多情況下避免加鎖操作,因此開銷更低。MVCC的實現大都都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。InnoDB的MVCC實現,是通過保存數據在某個時間點的快照來實現的。一個事務,不管其執行多長時間,其內部看到的數據是一致的。也就是事務在執行的過程中不會相互影響。下面我們簡述一下MVCC在InnoDB中的實現。

InnoDB的MVCC,通過在每行記錄后面保存兩個隱藏的列來實現:一個保存了行的創建時間,一個保存行的過期時間(刪除時間),當然,這里的時間并不是時間戳,而是系統版本號,每開始一個新的事務,系統版本號就會遞增。在RR隔離級別下,MVCC的操作如下:

select操作。

InnoDB只查找版本早于(包含等于)當前事務版本的數據行。可以確保事務讀取的行,要么是事務開始前就已存在,或者事務自身插入或修改的記錄。

行的刪除版本要么未定義,要么大于當前事務版本號。可以確保事務讀取的行,在事務開始之前未刪除。

insert操作。將新插入的行保存當前版本號為行版本號。

delete操作。將刪除的行保存當前版本號為刪除標識。

update操作。變為insert和delete操作的組合,insert的行保存當前版本號為行版本號,delete則保存當前版本號到原來的行作為刪除標識。

由于舊數據并不真正的刪除,所以必須對這些數據進行清理,innodb會開啟一個后臺線程執行清理工作,具體的規則是將刪除版本號小于當前系統版本的行刪除,這個過程叫做purge。

3、簡單的小例子

create table yang( id int primary key auto_increment, name varchar(20));}

假設系統的版本號從1開始.

INSERT

InnoDB為新插入的每一行保存當前系統版本號作為版本號.第一個事務ID為1;

start transaction;insert into yang values(NULL,’yang’) ;insert into yang values(NULL,’long’);insert into yang values(NULL,’fei’);commit;

對應在數據中的表如下(后面兩列是隱藏列,我們通過查詢語句并看不到)

mysql的MVCC多版本并發控制的實現

SELECT

 InnoDB會根據以下兩個條件檢查每行記錄: a.InnoDB只會查找版本早于當前事務版本的數據行(也就是,行的系統版本號小于或等于事務的系統版本號),這樣可以確保事務讀取的行,要么是在事務開始前已經存在的,要么是事務自身插入或者修改過的. b.行的刪除版本要么未定義,要么大于當前事務版本號,這可以確保事務讀取到的行,在事務開始之前未被刪除.  只有a,b同時滿足的記錄,才能返回作為查詢結果.

DELETE

 InnoDB會為刪除的每一行保存當前系統的版本號(事務的ID)作為刪除標識. 看下面的具體例子分析: 第二個事務,ID為2;

start transaction;select * from yang; //(1)select * from yang; //(2)commit;

假設1

假設在執行這個事務ID為2的過程中,剛執行到(1),這時,有另一個事務ID為3往這個表里插入了一條數據;第三個事務ID為3;

start transaction;insert into yang values(NULL,’tian’);commit;

這時表中的數據如下:

mysql的MVCC多版本并發控制的實現

然后接著執行事務2中的(2),由于id=4的數據的創建時間(事務ID為3),執行當前事務的ID為2,而InnoDB只會查找事務ID小于等于當前事務ID的數據行,所以id=4的數據行并不會在執行事務2中的(2)被檢索出來,在事務2中的兩條select 語句檢索出來的數據都只會下表:

mysql的MVCC多版本并發控制的實現

 假設2

假設在執行這個事務ID為2的過程中,剛執行到(1),假設事務執行完事務3后,接著又執行了事務4;第四個事務:

start transaction; delete from yang where id=1;commit;

此時數據庫中的表如下:

mysql的MVCC多版本并發控制的實現

接著執行事務ID為2的事務(2),根據SELECT 檢索條件可以知道,它會檢索創建時間(創建事務的ID)小于當前事務ID的行和刪除時間(刪除事務的ID)大于當前事務的行,而id=4的行上面已經說過,而id=1的行由于刪除時間(刪除事務的ID)大于當前事務的ID,所以事務2的(2)select * from yang也會把id=1的數據檢索出來.所以,事務2中的兩條select 語句檢索出來的數據都如下:

mysql的MVCC多版本并發控制的實現

UPDATEInnoDB執行UPDATE,實際上是新插入了一行記錄,并保存其創建時間為當前事務的ID,同時保存當前事務ID到要UPDATE的行的刪除時間.

 假設3假設在執行完事務2的(1)后又執行,其它用戶執行了事務3,4,這時,又有一個用戶對這張表執行了UPDATE操作: 第5個事務:

start transaction;update yang set name=’Long’ where id=2;commit;

根據update的更新原則:會生成新的一行,并在原來要修改的列的刪除時間列上添加本事務ID,得到表如下:

mysql的MVCC多版本并發控制的實現

繼續執行事務2的(2),根據select 語句的檢索條件,得到下表:

mysql的MVCC多版本并發控制的實現

還是和事務2中(1)select 得到相同的結果.

到此這篇關于mysql的MVCC多版本并發控制的實現的文章就介紹到這了,更多相關mysql MVCC多版本并發控制內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品一级黄| 在线观看视频91| 91亚洲精品一区二区乱码| 韩国精品在线观看| 久久99久久精品欧美| 久久国产免费看| 狠狠色狠狠色合久久伊人| 老司机免费视频一区二区三区| 午夜久久久久久电影| 天堂一区二区在线| 日韩电影免费在线观看网站| 日本欧美久久久久免费播放网| 日本不卡视频在线| 国产一区二区女| 高清不卡在线观看| 欧美日韩福利| 日韩精品一区二区三区老鸭窝 | 奇米888四色在线精品| 成人欧美一区二区三区在线播放| 久久久久久久久久久久久夜| 国产精品三级电影| 一二三四社区欧美黄| 视频一区视频二区中文| 九色综合狠狠综合久久| 国产iv一区二区三区| 欧美日本国产精品| 国产欧美高清| 欧美精品tushy高清| 亚洲国产精品成人综合色在线婷婷| 国产精品麻豆99久久久久久| 亚洲一区二区五区| 国产永久精品大片wwwapp| 99精品欧美一区二区蜜桃免费| 极品日韩久久| 在线视频欧美精品| 久久婷婷成人综合色| 艳妇臀荡乳欲伦亚洲一区| 美国十次综合导航| 91麻豆精品一区二区三区| 亚洲少妇诱惑| 欧美日韩在线直播| 欧美韩国日本一区| 久久精品国产亚洲一区二区三区| 99久久精品免费| 性欧美xxxx大乳国产app| 日韩一级片网站| 亚洲精品免费播放| 国产精品影视天天线| 国产精品vip| 欧美人xxxx| 亚洲自拍另类综合| 丁香五精品蜜臀久久久久99网站 | 在线亚洲免费| 日韩你懂的在线观看| 亚洲免费在线视频| 成人性视频网站| 免费在线亚洲欧美| 国产片一区二区| 国产精品一级二级三级| 99精品国产在热久久婷婷| 欧美成人福利视频| 麻豆91免费看| 99热精品在线| 国产无一区二区| 韩国欧美国产1区| 翔田千里一区二区| 国产日韩欧美高清在线| 国产精品一区在线观看乱码| 国产精品一区视频网站| 欧美激情一区二区三区蜜桃视频| 久久99精品久久只有精品| 国产视频在线观看一区| 亚洲国产精品v| 懂色av一区二区夜夜嗨| 91成人免费电影| 亚洲国产精品一区二区www| 欧美日韩三级| 精品国一区二区三区| 狠狠色2019综合网| 久久久久久久久久久久久9999| 国产午夜精品美女毛片视频| 国产福利精品一区二区| 欧美中文一区二区三区| 午夜激情综合网| 国产亚洲精品久久飘花 | 99久久精品免费看| 欧美变态tickling挠脚心| 国产麻豆91精品| 欧美精品自拍偷拍| 久久精品99久久久| 欧美在线观看一区二区| 亚洲电影在线免费观看| 99精品国产福利在线观看免费| 成人免费在线观看入口| 欧美91大片| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲理论在线观看| 99re66热这里只有精品4| 一区二区三区免费| 国产精品普通话对白| 亚洲国产成人av好男人在线观看| 日韩午夜电影| 午夜成人在线视频| 色婷婷亚洲一区二区三区| 免费成人在线网站| 欧美日韩国产成人在线免费| 久久er99热精品一区二区| 欧美日韩精品一区二区天天拍小说| 久久疯狂做爰流白浆xx| 欧美日韩精品一区二区三区| 国产在线精品一区二区| 日韩美女一区二区三区四区| 99视频热这里只有精品免费| 久久精品日韩一区二区三区| 欧美欧美全黄| 亚洲一区中文日韩| 欧美性大战久久久久久久| 国产精品主播直播| 国产欧美日韩久久| 国产精品日韩高清| 精品在线观看免费| 日韩精品一区二区三区在线播放| www.激情成人| 中文字幕日韩av资源站| 国产精品美女| 国产精品18久久久久久久久 | 久久久久久久久久久黄色| 影音先锋在线一区| 丝袜美腿亚洲色图| 欧美一区二区三区在线观看| 女同一区二区| 亚洲第一福利一区| 欧美一区二区三区啪啪| 国内精品久久久久久久果冻传媒| 一区二区三区日本| 欧美精品第1页| 欧美日韩一区二区三区免费| 五月婷婷欧美视频| 欧美一级理论片| 亚洲国产精品久久久久婷婷老年| 日韩黄色片在线观看| 欧美mv日韩mv| 午夜一区二区三视频在线观看| 国产一区二区不卡| 亚洲精品水蜜桃| 91精品国产乱| 亚洲一区不卡| 成人av在线看| 亚州成人在线电影| 精品国产sm最大网站免费看| 亚洲一区二区三区精品在线观看| 国产一区二区三区四区在线观看| √…a在线天堂一区| 欧美日韩高清不卡| 亚洲婷婷在线| 成人国产精品视频| 蜜臀国产一区二区三区在线播放 | 青青草精品视频| 国产精品第13页| 欧美一级在线免费| 久久精品人人| 国产在线欧美日韩| 国产不卡视频在线观看| 亚洲大型综合色站| 中文字幕在线观看不卡视频| 欧美区一区二区三区| 国产精品社区| 亚洲一级一区| 成人av在线一区二区三区| 免费看精品久久片| 一区二区三区在线视频播放| 国产亚洲一二三区| 3751色影院一区二区三区| 久久一区视频| 99在线|亚洲一区二区| 午夜视频一区| 粉嫩高潮美女一区二区三区| 蜜桃视频在线一区| 亚洲国产日产av| 中文字幕在线一区二区三区| 精品日韩一区二区三区免费视频| 欧美体内she精视频| 久久综合中文| 亚洲欧美日韩精品久久久| 亚洲午夜激情在线| 国产精品xvideos88| 成人综合在线网站| 国产激情视频一区二区三区欧美 | 亚洲成人资源| 国模精品一区二区三区| 97精品久久久久中文字幕| 成人av在线播放网站| 高清不卡在线观看av| 成人午夜电影小说| 国产高清无密码一区二区三区| 久久国产精品免费| 久久99久久久久| 国产精品自拍在线| 国产精品18久久久久久久久 | 韩国一区二区视频|