久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MVCC中快照怎么工作的

共計(jì) 1759 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

這篇文章將為大家詳細(xì)講解有關(guān) MVCC 中快照怎么工作的,丸趣 TV 小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

MVCC

在 MySQL 中(innodb 存儲(chǔ)引擎),實(shí)際上每條記錄在更新的時(shí)候都會(huì)同時(shí)記錄一條回滾操作。記錄上的最新值,通過(guò)回滾操作,都可以得到前一個(gè)狀態(tài)的值。

假設(shè)一個(gè)值從 1 被按順序改成了 2、3、4,在回滾日志里面就會(huì)有類似下面的記錄。

當(dāng)前值是 4,但是在查詢這條記錄的時(shí)候,不同時(shí)刻啟動(dòng)的事務(wù)會(huì)有不同的 read-view。如圖中看到的,在視圖 A、B、C 里面,這一個(gè)記錄的值分別是 1、2、4,同一條記錄在系統(tǒng)中可以存在多個(gè)版本,就是數(shù)據(jù)庫(kù)的多版本并發(fā)控制(MVCC)。對(duì)于 read-view A,要得到 1,就必須將當(dāng)前值依次執(zhí)行圖中所有的回滾操作得到。

InnoDB 是怎么定義一個(gè)‘快照’

InnoDB 里面每個(gè)事務(wù)有一個(gè)唯一的事務(wù) ID,叫作 transaction id。它是在事務(wù)開(kāi)始的時(shí)候向 InnoDB 的事務(wù)系統(tǒng)申請(qǐng)的,是按申請(qǐng)順序嚴(yán)格遞增的。

而每行數(shù)據(jù)也都是有多個(gè)版本的。每次事務(wù)更新數(shù)據(jù)的時(shí)候,都會(huì)生成一個(gè)新的數(shù)據(jù)版本,并且把 transaction id 賦值給這個(gè)數(shù)據(jù)版本的事務(wù) ID,記為 row trx_id。同時(shí),舊的數(shù)據(jù)版本要保留,并且在新的數(shù)據(jù)版本中,能夠有信息可以直接拿到它。

也就是說(shuō),數(shù)據(jù)表中的一行記錄,其實(shí)可能有多個(gè)版本 (row),每個(gè)版本有自己的 row trx_id。

按照可重復(fù)讀的定義,一個(gè)事務(wù)啟動(dòng)的時(shí)候,能夠看到所有已經(jīng)提交的事務(wù)結(jié)果。但是之后,這個(gè)事務(wù)執(zhí)行期間,其他事務(wù)的更新對(duì)它不可見(jiàn)。

因此,一個(gè)事務(wù)只需要在啟動(dòng)的時(shí)候聲明說(shuō),“以我啟動(dòng)的時(shí)刻為準(zhǔn),如果一個(gè)數(shù)據(jù)版本是在我啟動(dòng)之前生成的,就認(rèn);如果是我啟動(dòng)以后才生成的,我就不認(rèn),我必須要找到它的上一個(gè)版本”。當(dāng)然,如果“上一個(gè)版本”也不可見(jiàn),那就得繼續(xù)往前找。還有,如果是這個(gè)事務(wù)自己更新的數(shù)據(jù),它自己還是要認(rèn)的。

在實(shí)現(xiàn)上,InnoDB 為每個(gè)事務(wù)構(gòu)造了一個(gè)數(shù)組,用來(lái)保存這個(gè)事務(wù)啟動(dòng)瞬間,當(dāng)前正在“活躍”的所有事務(wù) ID?!盎钴S”指的就是,啟動(dòng)了但還沒(méi)提交。

數(shù)組里面事務(wù) ID 的最小值記為低水位,當(dāng)前系統(tǒng)里面已經(jīng)創(chuàng)建過(guò)的事務(wù) ID 的最大值加 1 記為高水位。

這個(gè)視圖數(shù)組把所有的 row trx_id 分成了幾種不同的情況。

這樣,對(duì)于當(dāng)前事務(wù)的啟動(dòng)瞬間來(lái)說(shuō),一個(gè)數(shù)據(jù)版本的 row trx_id,有以下幾種可能:

如果落在綠色部分,表示這個(gè)版本是已提交的事務(wù)或者是當(dāng)前事務(wù)自己生成的,這個(gè)數(shù)據(jù)是可見(jiàn)的;

如果落在紅色部分,表示這個(gè)版本是由將來(lái)啟動(dòng)的事務(wù)生成的,是肯定不可見(jiàn)的;

如果落在黃色部分,那就包括兩種情況

a. 若 row trx_id 在數(shù)組中,表示這個(gè)版本是由還沒(méi)提交的事務(wù)生成的,不可見(jiàn);
b. 若 row trx_id 不在數(shù)組中,表示這個(gè)版本是已經(jīng)提交了的事務(wù)生成的,可見(jiàn)。

舉個(gè)例子:

session A 啟動(dòng)了一個(gè)事務(wù) A,在事務(wù) A 開(kāi)始前,系統(tǒng)里面分別有三個(gè)活躍事務(wù),ID 分別 是 90 93 95。
那么事務(wù) A 的 ID 是 100
此時(shí)對(duì)于事務(wù) A 的視圖數(shù)組是這樣的【90 93 95 100】,其中 低水位是 90,高水位是 100+1=101;
現(xiàn)在事務(wù) A 開(kāi)始讀數(shù)據(jù)了

假如讀到了 ID 是 104 的,大于高水位 101,表示這個(gè)版本是由將來(lái)啟動(dòng)的事務(wù)生成的,是肯定不可見(jiàn)的;

讀到了 ID 是 88 的,小于低水位 90,表示這個(gè)版本是已提交的事務(wù)或者是當(dāng)前事務(wù)自己生成的,這個(gè)數(shù)據(jù)是可見(jiàn)的;

讀到了 ID 是 94 的,在低水位和高水位之間,但是不在【90 93 95 100】這個(gè)數(shù)組里,表示這個(gè)版本是已經(jīng)提交了的事務(wù)生成的,可見(jiàn)。

讀到了 ID 是 93 的,在低水位和高水位之間,這【90 93 95 100】這個(gè)數(shù)組里,表示這個(gè)版本是由還沒(méi)提交的事務(wù)生成的,不可見(jiàn);

這個(gè)判斷規(guī)則是從代碼邏輯直接轉(zhuǎn)譯過(guò)來(lái)的,但是正如你所見(jiàn),用于人肉分析可見(jiàn)性很麻煩。

所以,我來(lái)給你翻譯一下。一個(gè)數(shù)據(jù)版本,對(duì)于一個(gè)事務(wù)視圖來(lái)說(shuō),除了自己的更新總是可見(jiàn)以外,有三種情況:

版本未提交,不可見(jiàn);

版本已提交,但是是在視圖創(chuàng)建后提交的,不可見(jiàn);

版本已提交,而且是在視圖創(chuàng)建前提交的,可見(jiàn)。

關(guān)于“MVCC 中快照怎么工作的”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-15發(fā)表,共計(jì)1759字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 博野县| 崇文区| 柞水县| 巩留县| 黎平县| 阳泉市| 福建省| 上杭县| 丰镇市| 永春县| 闻喜县| 县级市| 儋州市| 通榆县| 陆丰市| 中西区| 当阳市| 贵南县| 海宁市| 兴安县| 陇西县| 崇义县| 荆门市| 蕉岭县| 万州区| 兴安县| 陆丰市| 岱山县| 郓城县| 瑞安市| 英山县| 诸暨市| 平顺县| 张掖市| 湘阴县| 丽水市| 平昌县| 上栗县| 弥渡县| 大田县| 大足县|