欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

MySQL多版本控制器MVCC的介紹

這篇文章主要介紹“MySQL多版本控制器MVCC的介紹”,在日常操作中,相信很多人在MySQL多版本控制器MVCC的介紹問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL多版本控制器MVCC的介紹”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)橋西免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

    MySQl大多數(shù)事務(wù)性存儲引擎實現(xiàn)的都不是簡單的行級鎖?;诟咝阅芸紤],他們一般都同時是想了多版本并發(fā)控制器(MVCC)。不僅僅MySQL,包括Oracle、PostgreSQL等其他數(shù)據(jù)庫系統(tǒng)也都實現(xiàn)了MVCC,但各自實現(xiàn)機制不盡相同,因為MVCC沒有一個統(tǒng)一的實現(xiàn)標準。MVCC可以說是行級鎖的一個變種,但是他在多數(shù)情況下避免了加鎖操作,因此開銷更低。雖然實現(xiàn)機制有所不同,但大都實現(xiàn)了非阻塞的讀操作,寫操作也只鎖定必要的行。

MVCC只存在于MySQL的Read Commit和Read Repeatable的隔離級別下。

事務(wù)日志

    事務(wù)日志可以幫助提高事務(wù)的效率。使用事務(wù)日志,存儲引擎在修改表的數(shù)據(jù)時只需要修改其內(nèi)存拷貝,再把該修改行為記錄到持久在硬盤上的事務(wù)日志中,而不用每次都將修改的數(shù)據(jù)本身持久到磁盤。事務(wù)日志采用的是追加的方式,因此寫日志的操作是磁盤上一小塊區(qū)域內(nèi)的順序 I/O,而不像隨機 I/O需要在次盤的多個地方移動磁頭,所以采用事務(wù)日志的方式相對來說要快得多。事務(wù)日志持久以后,內(nèi)存中被修改的數(shù)據(jù)在后臺可以慢慢的刷回到磁盤。目前大多數(shù)存儲引擎都是這樣實現(xiàn)的,我們通常稱之為預(yù)寫式日志(Write-Ahead Logging),修改數(shù)據(jù)需要寫兩次磁盤。
    redo log 是InnoDB存儲引擎層的日志,主要用于記錄事務(wù)的日志信息,開啟一個事務(wù)時,會記錄一個日志序列號,當(dāng)事務(wù)執(zhí)行時會向日志緩沖(redo buffer)插入事務(wù)日志,并且在事務(wù)提交前會把redo buffer中的日志信息記錄到磁盤中。如數(shù)據(jù)庫掉電,InnoDB存儲引擎會使用redo log恢復(fù)到掉電前的時刻,以此來保證數(shù)據(jù)的完整性。
    undo log 是InnoDB存儲引擎層的日志,主要用于記錄數(shù)據(jù)被修改之前的日志,在表信息修改之前先會把數(shù)據(jù)拷貝到undo log 里,當(dāng)事務(wù)進行回滾時可以通過undo log 里的日志進行數(shù)據(jù)還原。
    undo log用于MVCC快照讀的數(shù)據(jù),在MVCC多版本控制中,通過讀取undo log的歷史版本數(shù)據(jù)可以實現(xiàn)不同事務(wù)版本號都擁有自己獨立的快照數(shù)據(jù)版本。有時候應(yīng)用到行版本控制的時候,也是通過undo log來實現(xiàn)的:當(dāng)讀取的某一行被其他事務(wù)鎖定時,它可以從undo log中分析出該行記錄以前的數(shù)據(jù)是什么,從而提供該行版本信息,讓用戶實現(xiàn)非鎖定一致性讀取。

    InnoDB是一個多版本的存儲引擎:它保存有關(guān)已更改行的舊版本的信息,以支持并發(fā)和回滾等事務(wù)功能 。此信息存儲在表空間中稱為回滾段的數(shù)據(jù)結(jié)構(gòu)中(在Oracle中的類似數(shù)據(jù)結(jié)構(gòu)之后)。InnoDB 使用回滾段中的信息來執(zhí)行事務(wù)回滾中所需的撤消操作。它還使用該信息構(gòu)建行的早期版本以進行一致讀取。
    在內(nèi)部,InnoDB為數(shù)據(jù)庫中存儲的每一行添加三個字段。6字節(jié)DB_TRX_ID字段指示插入或更新行的最后一個事務(wù)的事務(wù)標識符。此外,刪除在內(nèi)部被視為更新,其中行中的特殊位被設(shè)置為將其標記為已刪除。每行還包含一個DB_ROLL_PTR稱為滾動指針的7字節(jié) 字段。roll指針指向?qū)懭牖貪L段的undo log記錄。如果更新了行,則undo log記錄包含在更新行之前重建行內(nèi)容所需的信息。一個6字節(jié)的DB_ROW_ID字段包含一個行ID,當(dāng)插入新行時,該行ID會單調(diào)增加。如果 InnoDB自動生成聚簇索引,索引包含行ID值。否則,該 DB_ROW_ID列不會出現(xiàn)在任何索引中。
    撤消段中的undo log分為插入和更新undo log。只在事務(wù)回滾中才需要插入undo log,并且可以在事務(wù)提交后立即丟棄。更新undo log也用于一致性讀取,但只有在沒有事務(wù)InnoDB已分配快照的情況下才能丟棄它們 ,在一致讀取中可能需要更新undo log中的信息來構(gòu)建數(shù)據(jù)庫的早期版本行。
    在InnoDB多版本控制方案中,使用SQL語句刪除行時,不會立即從數(shù)據(jù)庫中物理刪除該行。InnoDB只有在丟棄為刪除寫入的更新undo log記錄時,才會物理刪除相應(yīng)的行及其索引記錄。此刪除操作稱為purge,并且速度非???,通常與執(zhí)行刪除的SQL語句的時間順序相同。

  • DB_TRX_ID:記錄操作該數(shù)據(jù)事務(wù)的事務(wù)ID;

  • DB_ROLL_PTR:指向上一個版本數(shù)據(jù)在undo log 里的位置指針;

  • DB_ROW_ID: 隱藏ID ,當(dāng)創(chuàng)建表沒有合適的索引作為聚集索引時,會用該隱藏ID創(chuàng)建聚集索引;

read view
    read view 其實就是一個保存事務(wù)ID的list列表。記錄的是本事務(wù)執(zhí)行時,MySQL還有哪些事務(wù)在執(zhí)行。
    Read Repeatable 對應(yīng)的是在每個事務(wù)啟動的時候創(chuàng)建一個read view。
    Read Commit 對應(yīng)的是每次執(zhí)行SQL statement時候創(chuàng)建一個read view。

  • Read View結(jié)構(gòu)

struct read_view_t{
	// 由于是逆序排列,所以low/up有所顛倒
	// 能看到當(dāng)前行版本的高水位標識,> low_limit_id皆不能看見
	trx_id_t	low_limit_id;
	// 能看到當(dāng)前行版本的低水位標識,< up_limit_id皆能看見
	trx_id_t	up_limit_id;
	// 當(dāng)前活躍事務(wù)(即未提交的事務(wù))的數(shù)量
	ulint		n_trx_ids;
	// 以逆序排列的當(dāng)前獲取活躍事務(wù)id的數(shù)組
	// 其up_limit_id<tx_id<low_limit_id
	trx_id_t*	trx_ids;	
	// 創(chuàng)建當(dāng)前視圖的事務(wù)id
	trx_id_t	creator_trx_id;
	// 事務(wù)系統(tǒng)中的一致性視圖鏈表
	UT_LIST_NODE_T(read_view_t) view_list;
};
  • 版本可見性

read view其實保存的是當(dāng)前活躍事務(wù)的所有事務(wù)id,如果當(dāng)前行版本對應(yīng)修改的事務(wù)id不在當(dāng)前活躍事務(wù)里面的話,表示當(dāng)前版本可見,否則就是不可見。也就是看不到read view創(chuàng)建以后啟動的事務(wù),看不到read view創(chuàng)建時活躍的事務(wù)。Read View不可見的話,就從undo log中讀取。

只有在非鎖select下才會創(chuàng)建read view。

當(dāng)前讀和快照讀

  • 當(dāng)前讀

    當(dāng)前讀是讀取的數(shù)據(jù)庫最新的數(shù)據(jù),當(dāng)前讀和快照讀不同,因為要讀取最新的數(shù)據(jù)而且要保證事務(wù)的隔離性,所以當(dāng)前讀是需要對數(shù)據(jù)進行加鎖的 (Update、    delete、    insert、   select ....lock in share mode、   select for update 為當(dāng)前讀)

  • 快照讀

    快照讀是指讀取數(shù)據(jù)時不是讀取最新版本的數(shù)據(jù),而是基于歷史版本讀取的一個快照信息(mysql讀取undo log歷史版本) ;
快照讀可以使普通的SELECT 讀取數(shù)據(jù)時不用對表數(shù)據(jù)進行加鎖,從而解決了因為對數(shù)據(jù)庫表的加鎖而導(dǎo)致的兩個如下問題:

  1.     解決了因加鎖導(dǎo)致的修改數(shù)據(jù)時無法對數(shù)據(jù)讀取問題;

  2.     解決了因加鎖導(dǎo)致讀取數(shù)據(jù)時無法對數(shù)據(jù)進行修改的問題;

到此,關(guān)于“MySQL多版本控制器MVCC的介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)站標題:MySQL多版本控制器MVCC的介紹
鏈接URL:http://chinadenli.net/article18/gpdhdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站收錄、網(wǎng)站策劃、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
五月婷婷六月丁香在线观看| 久久精品视频就在久久| 中文字幕亚洲人妻在线视频| 九九热九九热九九热九九热 | 丁香六月啪啪激情综合区| 日韩成人高清免费在线| 欧美日韩精品人妻二区三区| 久七久精品视频黄色的| 91偷拍裸体一区二区三区| 国产视频在线一区二区| 高清在线精品一区二区| 欧美成人国产精品高清| 国产精品丝袜一二三区| 偷自拍亚洲欧美一区二页| 99久久精品午夜一区二| 亚洲视频一区二区久久久| 日本黄色高清视频久久| 色鬼综合久久鬼色88| 国产免费无遮挡精品视频| 午夜福利精品视频视频| 国产内射一级一片内射高清| 成年男女午夜久久久精品| 东京热加勒比一区二区三区| 91麻豆精品欧美一区| 久久综合狠狠综合久久综合| 亚洲综合色婷婷七月丁香| 亚洲国产丝袜一区二区三区四| 麻豆91成人国产在线观看| 午夜精品一区免费视频| 亚洲国产性感美女视频| 国内尹人香蕉综合在线| 日韩午夜老司机免费视频| 久久福利视频这里有精品| 黄片免费在线观看日韩| 粉嫩国产一区二区三区在线| 国产精品午夜福利在线观看| 91香蕉国产观看免费人人| 日韩欧美一区二区不卡视频| 日韩黄色大片免费在线| 91后入中出内射在线| 91人人妻人人爽人人狠狠|