偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

基于MVCC,我用C++自己手?jǐn)]了個(gè)MySQL!

數(shù)據(jù)庫(kù) MySQL
MVCC是一種通過(guò)記錄數(shù)據(jù)的歷史版本來(lái)提升事務(wù)并發(fā)處理能力的一項(xiàng)技術(shù),它能夠極大的提升在并發(fā)事務(wù)下數(shù)據(jù)的處理性能,目前,大部分關(guān)系型數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了MVCC機(jī)制。

沒(méi)錯(cuò),真如標(biāo)題所示,我基于MVCC算法(這里我姑且叫它算法吧,畢竟在實(shí)際寫(xiě)代碼時(shí),確實(shí)是利用算法實(shí)現(xiàn)的),使用C++寫(xiě)了個(gè)簡(jiǎn)易版的MySQL,實(shí)現(xiàn)了簡(jiǎn)易版的CRUD操作。

其實(shí),今天我并不打算先向小伙伴們演示我寫(xiě)的簡(jiǎn)易版MySQL,這個(gè)項(xiàng)目待我再優(yōu)化下,會(huì)開(kāi)源出來(lái)的,到時(shí)大家可以一起學(xué)習(xí),一起進(jìn)步,一起來(lái)維護(hù)它。

今天,我想跟大家重點(diǎn)聊聊MVCC,網(wǎng)上關(guān)于MVCC的文章很多,大部分都是基于版本鏈進(jìn)行介紹的,其實(shí)對(duì)于初學(xué)者來(lái)說(shuō),使用版本鏈介紹MVCC其實(shí)還是挺難理解的。今天,我就來(lái)跟大家聊聊我是如何理解MVCC的,MVCC其實(shí)很簡(jiǎn)單,不用版本鏈你也可以徹底理解透徹。

MVCC技術(shù)

MVCC是一種通過(guò)記錄數(shù)據(jù)的歷史版本來(lái)提升事務(wù)并發(fā)處理能力的一項(xiàng)技術(shù),它能夠極大的提升在并發(fā)事務(wù)下數(shù)據(jù)的處理性能,目前,大部分關(guān)系型數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了MVCC機(jī)制。

MVCC主要解決多事務(wù)并發(fā)控制問(wèn)題,也就是保證事務(wù)的隔離性。

MVCC的存儲(chǔ)方式

MVCC大體上可以分為三種存儲(chǔ)方式,分別為Append-Only方式、Delta方式和Time-Travle方式,如下所示。

(1)Append-Only方式:將數(shù)據(jù)的歷史版本直接存儲(chǔ)在數(shù)據(jù)表中,代表數(shù)據(jù)庫(kù)為PostgreSQL。

(2)Delta方式:將數(shù)據(jù)的增量歷史版本存儲(chǔ)在獨(dú)立的表空間,代表數(shù)據(jù)庫(kù)為MySQL和Oracle。

(3)Time-Travle方式:將數(shù)據(jù)的每個(gè)版本都全量存儲(chǔ)下來(lái),代表數(shù)據(jù)庫(kù)為HANA。

MVCC的工作原理

MVCC主要用來(lái)保證事務(wù)的隔離性,這里,我們就分別以讀已提交和可重復(fù)讀兩種隔離級(jí)別為例,來(lái)聊聊MVCC是如何工作的。

讀已提交MVCC的工作原理

在讀已提交隔離級(jí)別下,當(dāng)前事務(wù)只能看到兩類數(shù)據(jù),如下所示。

(1)當(dāng)前事務(wù)自身產(chǎn)生的數(shù)據(jù)。

(2)當(dāng)前事務(wù)開(kāi)啟之前,其他已經(jīng)提交的事務(wù)所產(chǎn)生的數(shù)據(jù)。

為了便于小伙伴們理解,這里我畫(huà)了一張簡(jiǎn)易的事務(wù)執(zhí)行圖,如下所示。

事務(wù)A到事務(wù)E是在數(shù)據(jù)庫(kù)中執(zhí)行的五個(gè)事務(wù),它們按照先后順序執(zhí)行,分別操作的是數(shù)據(jù)表中data1~data5的五條記錄。在t1時(shí)刻,啟動(dòng)事務(wù)E,事務(wù)E要讀取事務(wù)A到事務(wù)D的這四條記錄,在t1時(shí)刻,事務(wù)E啟動(dòng)時(shí),會(huì)向系統(tǒng)申請(qǐng)一個(gè)活動(dòng)事務(wù)列表,所謂的活動(dòng)事務(wù),就是已經(jīng)啟動(dòng)但是并未提交或者回滾的事務(wù)。

所以,在申請(qǐng)的活動(dòng)事務(wù)列表中會(huì)看到事務(wù)D,當(dāng)事務(wù)E查詢到data4這條數(shù)據(jù)記錄時(shí),其對(duì)應(yīng)的事務(wù)D正好在活動(dòng)事務(wù)列表中,事務(wù)E就會(huì)讀取data4的上一個(gè)版本。

而事務(wù)A、事務(wù)B和事務(wù)C在事務(wù)E啟動(dòng)時(shí)已經(jīng)提交,并且最新版本的事務(wù)id小于活動(dòng)事務(wù)D對(duì)應(yīng)的事務(wù)id,所以事務(wù)E能夠看到事務(wù)A、事務(wù)B和事務(wù)C對(duì)應(yīng)的data1、data2和data3記錄的最新版本。

可重復(fù)讀MVCC的工作原理

在重復(fù)讀隔離級(jí)別下,MVCC又是如何工作的呢?先來(lái)看張圖。

如果在讀已提交隔離級(jí)別下,則在t1時(shí)刻,事務(wù)E啟動(dòng)時(shí),事務(wù)A、事務(wù)B和事務(wù)C已經(jīng)提交,所以,事務(wù)E能夠讀取到事務(wù)A、事務(wù)B和事務(wù)C對(duì)應(yīng)的data1、data2和data3記錄的最新版本。而事務(wù)D屬于活動(dòng)事務(wù),所以,事務(wù)E能夠讀取到data4的上一個(gè)版本。

事務(wù)E執(zhí)行到t2時(shí)刻時(shí),事務(wù)D也已經(jīng)提交,按照之前的分析可知,在t2時(shí)刻,事務(wù)E能夠讀取到事務(wù)A、事務(wù)B、事務(wù)C和事務(wù)D對(duì)應(yīng)的數(shù)據(jù)data1、data2、data3和data4的最新版本。

在可重復(fù)讀隔離級(jí)別下,這顯然是不符合要求的。

在可重復(fù)讀隔離級(jí)別下,MVCC機(jī)制是如何解決這個(gè)問(wèn)題的呢?

其實(shí)解決的辦法很簡(jiǎn)單,就是在系統(tǒng)中記錄下t1時(shí)刻啟動(dòng)事務(wù)E時(shí)的活動(dòng)事務(wù)列表,在事務(wù)E執(zhí)行的過(guò)程中,一直使用在t1時(shí)刻記錄的活動(dòng)事務(wù)列表即可,這個(gè)一直使用的活動(dòng)事務(wù)列表被稱為“快照”。

很顯然,在t2時(shí)刻使用在t1時(shí)刻保存的活動(dòng)事務(wù)列表,則事務(wù)E在t1時(shí)刻和t2時(shí)刻讀取到的數(shù)據(jù)是一致性。

讀已提交與可重復(fù)讀MVCC的區(qū)別

讀已提交隔離級(jí)別下每個(gè)SQL語(yǔ)句都會(huì)有一個(gè)自己的快照,它們看到的數(shù)據(jù)庫(kù)中的數(shù)據(jù)是不同的。而在可重復(fù)讀隔離級(jí)別下,所有的SQL語(yǔ)句使用同一個(gè)快照,能夠看到數(shù)據(jù)庫(kù)中同樣的數(shù)據(jù)。

快照優(yōu)化

在實(shí)現(xiàn)MVCC時(shí),并只是簡(jiǎn)單的存儲(chǔ)事務(wù)id列表,而是會(huì)統(tǒng)計(jì)最小活動(dòng)事務(wù)id和最大已提交事務(wù)id,這樣做的好處是:大部分事務(wù)id通過(guò)比較這些邊界值就能夠迅速判別是讀取最新版本還是上一個(gè)版本,如果事務(wù)id正好落在這些邊界值的范圍之內(nèi),則只需要進(jìn)一步查找當(dāng)前事務(wù)id是否與活動(dòng)事務(wù)的id相匹配即可。如果相匹配,則說(shuō)明當(dāng)前事務(wù)是活動(dòng)事務(wù),可以看到當(dāng)前數(shù)據(jù)。

好了,關(guān)于MVCC,小伙伴們,你們理解了嗎?理解透徹后,再學(xué)習(xí)下MySQL的底層原理,有條件的話,閱讀下MySQL的源碼,然后跟冰河一起手寫(xiě)MySQL。

責(zé)任編輯:武曉燕 來(lái)源: 冰河技術(shù)
相關(guān)推薦

2020-09-10 06:58:34

C語(yǔ)言DBProxy

2021-05-14 13:30:17

Mybatis分表插件

2020-11-04 07:56:19

工具Linux 翻譯

2021-11-04 17:23:03

Java對(duì)象 immutable

2022-01-21 07:35:06

LRU緩存java

2021-11-02 14:19:15

插件MavengroupId

2021-04-27 07:52:19

StarterSpring Boot配置

2020-05-28 11:00:40

Flutter代碼框架

2010-05-14 15:23:03

2021-12-12 18:18:15

代碼元宇宙Python

2022-02-14 07:34:23

工具類GET、POST

2022-03-01 08:21:32

工具類代碼封裝網(wǎng)絡(luò)請(qǐng)求

2019-06-25 10:46:04

Flutter開(kāi)發(fā)APP

2021-10-04 09:29:41

對(duì)象池線程池

2022-03-01 11:38:51

RPC框架后端

2020-08-03 08:10:52

UDPTCP通信

2012-05-18 10:21:30

程序員CC++

2020-02-17 13:45:27

抓取代碼工具

2021-10-27 06:49:34

線程池Core函數(shù)

2021-02-22 11:13:17

VS Code代碼編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)