溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是MVCC機(jī)制

發(fā)布時(shí)間:2021-10-14 10:09:53 來(lái)源:億速云 閱讀:333 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“什么是MVCC機(jī)制”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是MVCC機(jī)制”吧!

1,undo log 版本鏈回顧

我們上篇講解了undo log版本鏈?zhǔn)窃鯓拥摹?a title="MYSQl" target="_blank" href="http://kemok4.com/mysql/">MYSQl深入探索系列二 undo log》咱們?cè)趤?lái)看下那張圖

什么是MVCC機(jī)制

2,什么是readview

我們不是說(shuō)mvcc嗎?怎么又出現(xiàn)個(gè)readview呢,這倆有什么關(guān)聯(lián)么?

別著急,聽我慢慢道來(lái)咱們還是簡(jiǎn)單畫個(gè)圖,看下這readview是個(gè)什么東西和mvcc是什么關(guān)系

什么是MVCC機(jī)制

通過(guò)上圖可以基本上分清楚他們3個(gè)之間的關(guān)系了吧 readview中主要就這4個(gè)東西

  • min_txr_id: 當(dāng)前readview中最小的事務(wù)id

  • max_txr_id:當(dāng)前readview中最大的事務(wù)id

  • creator_txr_id:本次readview的事務(wù)id

  • [xx,xx,xx]:當(dāng)前活躍的事務(wù)id數(shù)組

這幾個(gè)值究竟有什么用呢?比如說(shuō) 當(dāng)前的readview min_txr_id: 20 max_txr_id: 30  creator_txr_id:20  [20,30]  那么這個(gè)readview就是 事務(wù)20創(chuàng)建的,此時(shí)undo 版本鏈有 3個(gè) 分別對(duì)應(yīng)txr_id 19  22  29 哪改事務(wù)就只能讀取txr_id為19的那個(gè)版本,其他2個(gè)版本是讀取不到的。

3,事務(wù)的隔離級(jí)別以及每種隔離級(jí)別帶來(lái)的問(wèn)題

我們都知道有4中事務(wù)隔離級(jí)別

  • read uncommited: 讀為提交,即可以讀取到其他事務(wù)沒(méi)有提交數(shù)據(jù) 以下我簡(jiǎn)稱 ru

  • read committed: 讀提交,即只有其他事務(wù)提交后才可以被當(dāng)前事務(wù)讀取到 以下我簡(jiǎn)稱 rc

  • repeatable read:可重復(fù)讀,單次事務(wù)可以多次讀取到相同的值 以下我簡(jiǎn)稱 rr

  • serializable :  串行化,所以事務(wù)排隊(duì)依次執(zhí)行,不存在并發(fā)情況,性能最差

這幾種隔離級(jí)別常見(jiàn)的問(wèn)題是什么呢?

     ru 情景一 :有 A B 兩個(gè)事務(wù)同時(shí)來(lái)操作同一條數(shù)據(jù),A呢更新了這條數(shù)據(jù)值為a但是還沒(méi)提交,此時(shí)B讀取到了a,但是事務(wù)A某種原因回滾了,導(dǎo)致事務(wù)B再也讀取不到a了這就是 臟讀。

          情景二 :有AB兩個(gè)事務(wù)同時(shí)來(lái)更新統(tǒng)一條數(shù)據(jù)c,事務(wù)A呢將c更新成了a 還沒(méi)提交,此時(shí)事務(wù)b過(guò)來(lái)更新把a(bǔ)更新長(zhǎng)b 然后提交了。但是事A回滾了,導(dǎo)致事務(wù)B就蒙蔽了命名更新成b了現(xiàn)在變成c了,這就是 臟寫

     rc  情景一 :有2個(gè)事務(wù)AB在同時(shí)運(yùn)行,事務(wù)A 按照制定條件查詢了符合條件的行數(shù) 6條,select count(1) from xxx where age>18,此時(shí)事B插入了2條數(shù)據(jù)并且提交了事務(wù),事務(wù)A再次查詢發(fā)現(xiàn)符合的條數(shù)變成8條了,好奇怪啊 2次查詢同樣的條件居然查到的條數(shù)不一樣,這就是 幻讀

           請(qǐng)景二 :有2個(gè)事務(wù)AB在同時(shí)操作同一條數(shù)據(jù)c,事務(wù)查詢c值完成一些業(yè)務(wù)操作,此時(shí)事務(wù)A將數(shù)據(jù)c值更新成了a并且提交了,但是事務(wù)B再次查詢這條數(shù)據(jù)發(fā)現(xiàn)值不一樣了?同一個(gè)事務(wù)內(nèi)多次讀取到的同一條數(shù)據(jù)值不同,這就是不可重復(fù)讀

     rr  這個(gè)雖然解決了可重復(fù)讀的問(wèn)題,即一次事務(wù)中無(wú)論該條數(shù)據(jù)被其他事務(wù)更新了多少次,始終讀取到的都是同一個(gè)值,但是仍然有幻讀的問(wèn)題

4,mysql中是如何支持read committed的

mysql中是如何通過(guò)mvcc 支持read committed呢,如果我們?cè)趍ysql中設(shè)置的隔離級(jí)別是 rc 哪每次查詢都會(huì)生成一個(gè)新的readview,這是實(shí)現(xiàn)rc的關(guān)鍵,我們舉例看下

還是A(id=20)、B(id=30)兩個(gè)事務(wù)同時(shí)來(lái)操作數(shù)據(jù)c,事務(wù)A第一次查詢的時(shí)候生成readview 1 min_txr_id=20 ,max_txr_id=30,活躍事務(wù)[20,30],creator_txr_id=20  對(duì)應(yīng)的undo log版本是txr_id=19  舊值是c。

此時(shí)事務(wù)B將c更新為b并且提交了,生成了undo log txr_id=30的版本,事務(wù)A再次發(fā)起查詢生成新的readview 2 min_txr_id=20,max_txr_id=31,活躍事務(wù)[20],creator_txr_id=20。

發(fā)現(xiàn)活躍的事務(wù)只有它自己了,然后順著undo log版本鏈查到到txr_id=30這條,雖然它的事務(wù)id比自己大,但是活躍事務(wù)中并沒(méi)有它,說(shuō)明事務(wù)30已經(jīng)提交了,所以此時(shí)可以看到該版本,所以事務(wù)A第二次讀取的c值為b。

5,mysql中是如何支持repeatble read的

我們來(lái)看下mysql怎么通過(guò)mvcc 實(shí)現(xiàn)rr可以同時(shí)解決不可重復(fù)讀,幻想讀的2中問(wèn)題的。

如果我們將mysql設(shè)置rr隔離級(jí)別,每次事務(wù)只會(huì)生成一個(gè)readview,不管當(dāng)前事務(wù)查詢數(shù)據(jù)庫(kù)多少次。

如果每次事務(wù)讀取的readview相同也就是每次能看到的undo log版本相同,所以每次看到的數(shù)據(jù)也就相同,即可解決可重復(fù)讀、幻想讀的問(wèn)題。

到此,相信大家對(duì)“什么是MVCC機(jī)制”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI