之前做了個(gè)InnoDB的分享,主要是關(guān)于InnoDB中B+Tree的結(jié)構(gòu)和MVCC的實(shí)現(xiàn)。 paper writing services PPT:?BpTree_MVCC 下面把PPT內(nèi)容稍微整理一下。 首先是B+Tree,下面給出InnoDB中B+Tree的結(jié)構(gòu)(via) 有如下特點(diǎn): 尋道次數(shù)固定,且次數(shù)少(因?yàn)闃?shù)高度比較
之前做了個(gè)InnoDB的分享,主要是關(guān)于InnoDB中B+Tree的結(jié)構(gòu)和MVCC的實(shí)現(xiàn)。
PPT:?BpTree_MVCC
下面把PPT內(nèi)容稍微整理一下。
首先是B+Tree,下面給出InnoDB中B+Tree的結(jié)構(gòu)(via)
有如下特點(diǎn):
這里強(qiáng)烈推薦?B+Tree index structures in InnoDB 這篇文章,詳細(xì)介紹了InnoDB中B+Tree的具體實(shí)現(xiàn)結(jié)構(gòu)。
隨后是關(guān)于MVCC。
MVCC是多版本并發(fā)控制,用于在實(shí)現(xiàn)事務(wù)操作時(shí),替代單純的讀寫(xiě)鎖。單純的讀寫(xiě)鎖會(huì)對(duì)所有讀過(guò)的數(shù)據(jù)加讀寫(xiě)鎖,讀了就不能寫(xiě),寫(xiě)了就不能讀。
既然是解決讀寫(xiě)沖突的問(wèn)題,那何時(shí)能寫(xiě)何時(shí)能讀就是要考慮的重點(diǎn),為此有“隔離級(jí)別”的概念。這個(gè)概念強(qiáng)調(diào)的就是在什么情況下,允許讀,什么情況下,允許寫(xiě)。
InnoDB的MVCC支持四種隔離級(jí)別,分別是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。其中最常用的是“READ?COMMITTED:讀已提交”和“REPEATABLE READ:可重復(fù)讀”。
需要注意的是,無(wú)論任何隔離級(jí)別,一旦某條記錄被UPDATE/DELETE/SELECT FOR UPDATE,即加X(jué)鎖后,事務(wù)提交前就不能再被更新(加X(jué)鎖)了。
InnoDB是如何實(shí)現(xiàn)事務(wù)的多版本呢,我在演講的時(shí)候也請(qǐng)出了網(wǎng)易何登成大神的PPT
地址:?InnoDB Transaction Lock and MVCC:微盤(pán)地址??Slideshare地址
這個(gè)PPT詳細(xì)介紹了MVCC的具體實(shí)現(xiàn),包括鎖相關(guān)的實(shí)現(xiàn),下面我簡(jiǎn)單總結(jié)下重點(diǎn)。
InnoDB通過(guò)ReadView(視圖)來(lái)實(shí)現(xiàn)上述隔離級(jí)別。ReadView會(huì)記錄當(dāng)前狀態(tài)下:
同時(shí),事務(wù)修改字段時(shí),在修改原來(lái)的值的時(shí)候,會(huì)標(biāo)注當(dāng)前事務(wù)的ID,同時(shí)把舊的數(shù)據(jù)和舊的事務(wù)ID放到回滾段。
有了上述兩項(xiàng)操作,那么ReadView的作用就體現(xiàn)出來(lái)了,即Select語(yǔ)句讀?。?/p>
同時(shí),任何小于“最小的活躍事務(wù)的事務(wù)ID”的數(shù)據(jù)都可以被回收,因?yàn)樗鼈冊(cè)僖膊粫?huì)被讀取到。
因此可以發(fā)現(xiàn),READ?COMMITTED、REPEATABLE READ這兩個(gè)級(jí)別的差別,就在于ReadView的創(chuàng)建時(shí)機(jī)。前者再語(yǔ)句開(kāi)始時(shí)創(chuàng)建ReadView,語(yǔ)句結(jié)束后Drop;后者在事務(wù)開(kāi)始時(shí)創(chuàng)建,事務(wù)提交后Drop。即可實(shí)現(xiàn)其功能。
要注意的是,即便對(duì)于READ?COMMITTED級(jí)別,如果語(yǔ)句執(zhí)行過(guò)程中又有新的事務(wù)提交,select還是看不到的(極端情況)。
ReadView的存儲(chǔ)結(jié)構(gòu),或者是更深入的研究,可以去看前述的PPT,不再重復(fù)。
其實(shí)還分享了關(guān)于回滾段、回滾方式,MySQL的X-commit二段提交,對(duì)B+Tree的一些操作,感覺(jué)寫(xiě)字還是有點(diǎn)兒蒼白,況且
Jeremy Cole和何登成的blog和PPT都要詳細(xì)、優(yōu)雅的多,推薦有興趣的同學(xué)去看看。
原文地址:InnoDB中的B+Tree和MVCC, 感謝原作者分享。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com