真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MVCC中快照怎么工作的

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

十年建站經(jīng)驗(yàn), 成都網(wǎng)站建設(shè)、成都網(wǎng)站制作客戶的見證與正確選擇。創(chuàng)新互聯(lián)提供完善的營(yíng)銷型網(wǎng)頁建站明細(xì)報(bào)價(jià)表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

MVCC

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

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

MVCC中快照怎么工作的

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

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

InnoDB 里面每個(gè)事務(wù)有一個(gè)唯一的事務(wù) ID,叫作 transaction id。它是在事務(wù)開始的時(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ù)版本中,能夠有信息可以直接拿到它。

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

MVCC中快照怎么工作的

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

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

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

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

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

MVCC中快照怎么工作的

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

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

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

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

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

舉個(gè)例子:

session A 啟動(dòng)了一個(gè)事務(wù)A, 在事務(wù) A 開始前,系統(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開始讀數(shù)據(jù)了

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

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

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

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

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

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

  • 版本未提交,不可見;

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

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

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


分享題目:MVCC中快照怎么工作的
分享地址:http://weahome.cn/article/iiigcp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部