内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

MVCC詳細講解-創(chuàng)新互聯(lián)

今天小編給大家分享的是MVCC的詳細介紹,相信很多人都不太了解,為了讓大家更加了解MVCC,所以給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
  1. MVCC的實現(xiàn),是通過保存數(shù)據(jù)在某個時間點的快照來實現(xiàn)的,也就是說,不管需要執(zhí)行多長時間,每個事務(wù)看到的數(shù)據(jù)是一致的,根據(jù)事務(wù)開始的時間不同,每個事務(wù)對同一張表,同一時刻看到的數(shù)據(jù)可能是不一樣的。
  2. innodb在基于鎖的并發(fā)控制技術(shù)上,實現(xiàn)了MVCC技術(shù),innodb的MVCC技術(shù)有以下幾個特點:
    • 事務(wù)的標識,依靠事務(wù)ID,是一個全局唯一的64bits數(shù)值
    • 多版本,是元組級的多版本,而不是oracle實現(xiàn)的是頁面級的多版本
    • 最新的數(shù)據(jù)存儲在數(shù)據(jù)頁面中,其他數(shù)據(jù)的舊版本存儲在回滾段中
  3. 因為innodb的多版本是元組級的版本,所以在每個記錄上,有一些與并發(fā)和回滾等于事務(wù)相關(guān)的隱含字段
    • DATA_TRX_ID: 6字節(jié)長,表示上一個執(zhí)行插入或更新操作的事務(wù)
    • DATA_ROLL_PTR: 7字節(jié)長,表示舊版本的數(shù)據(jù)位于回滾段中的位置,指向的是一個舊版本,只有元組被更新,才有會新版本產(chǎn)生,舊版本被置于回滾段,因此一致性無鎖讀操作按照“read view”快照需要讀取舊版本時,只能根據(jù)事務(wù)ID回到回滾段中尋找舊版本
    • DATA_ROW_ID:6字節(jié)長,表示執(zhí)行插入操作后生成的單調(diào)自增長的行的ID標識,如果存在聚集索引,索引項則包括的是這個DB_ROW_ID值
    • DELETE_BIT: 刪除標志位
  4. 位于回滾段中的UNDO日志分為兩種
    • INSERT UNOD LOGS:插入到回滾段的日志,僅用于事務(wù)提交時使用,當(dāng)事務(wù)提交,則對應(yīng)的INSETR UNDO LOGS里面的內(nèi)容被清除
    • UPDATE UNDO LOGS:被用于一致性無鎖讀,為一致性讀提供快照隔離下的可被讀取的老版本數(shù)據(jù),當(dāng)沒有需要滿足一致性讀的快照時,一些老版本數(shù)據(jù)才被清理
  5. MVCC的工作機制
    • innodb的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實現(xiàn)的,這兩個列,一個保存的行的創(chuàng)建時間,一個保存行的過期時間,當(dāng)然存儲的并不是實際的時間值,而是系統(tǒng)版本號(system version number),每開始一個新的事務(wù),系統(tǒng)版本號就會遞增,事務(wù)開始時刻的系統(tǒng)本號會作為事務(wù)的版本號,用來和查詢到的每行記錄的版本號進行記錄,下面看一個在REPEATABLE READ隔離級別下,MVCC是如何操作的
    • SELECT
      • innodb會根據(jù)以下兩個條件檢查每行記錄,只有符合下面兩個條件的記錄,才能返回作為查詢結(jié)果
        1. innodb值只查找系統(tǒng)早已當(dāng)前事務(wù)版本的數(shù)據(jù)行(也就是行的系統(tǒng)版本號小于或等于事務(wù)的系統(tǒng)版本號),這樣可以確保事務(wù)讀取的行,要么是在事務(wù)開始前就已經(jīng)存在的,要不是事務(wù)自身插入或者修改過的
        2. 行的刪除版本要不未定義,要不大于當(dāng)前事務(wù)版本號,這可以確保事務(wù)讀取到的行,在事務(wù)開始之前未被刪除
    • INSERT
      • innodb為新插入的每一行保存當(dāng)前系統(tǒng)版本號作為行版本號
    • DELETE
      • innodb為刪除的每一行保存當(dāng)前系統(tǒng)版本號作為行刪除標識
    • UPDATE
      • innodb為插入一條新紀錄,保存當(dāng)前系統(tǒng)版本號作為行版本號,同時保存當(dāng)前系統(tǒng)的版本號到原先的行作為刪除標識
  6. 保留著兩個額外系統(tǒng)版本號,使得大多數(shù)讀操作讀不需要加鎖。這樣設(shè)計使得讀數(shù)據(jù)操作很簡單,性能很好,并且也能保證只會讀取到符合標準的行,不足之處是每行記錄都需要額外的存儲空間,需要做更多的行檢查工作,以及一些額外的維護工作
  7. MVCC只在REPEATABLE READ和READ COMMIT兩個隔離級別下工作,其他兩個隔離級別都和MVCC不兼容,因為READ UNCOMMIT總是讀取最新的數(shù)據(jù)行,而不是符合當(dāng)前事務(wù)版本的數(shù)據(jù)行,而SERIALIZEABLE則會對所有讀取的行都加鎖
  8. 下面我們就開始案例:
    *MVCC詳細講解
    • 我們執(zhí)行step7的時候發(fā)現(xiàn)一個問題,怎么id=4的查不出來呢,按照上面的規(guī)則,id=3的事務(wù)ID是2,T3的事務(wù)ID是3,這種情況id=4是可以查出來的呢,所以說上面的規(guī)則肯定還說的不是很詳細,有遺落的地方,我們接著往下面看
  9. 我們在事務(wù)隔離中可以知道,innodb在執(zhí)行select的時候會創(chuàng)建一個快照
    • 隔離級別大于等于可重復(fù)讀:事務(wù)塊的所有的SELECT操作都要使用同一個快照,此快照是在第一個SELECT操作時建立的
    • 隔離級別小于等于已提交讀:事務(wù)塊內(nèi)的所有的SELECT操作分別創(chuàng)建屬于自己的快照,因此每次讀都不同,后面的SELECT操作的讀就可以讀到本次讀之前已經(jīng)提交的數(shù)據(jù)
    • 當(dāng)前數(shù)據(jù)可以看到哪些數(shù)據(jù)就是由這個快照決定的,快照有下面幾個屬性,并且可見性也根據(jù)這幾個屬性來判斷的
      • m_up_limit_id  一個快照,有左右邊界,左邊界是最小值,右邊界是大值,此變量是左邊界
      • m_low_limit_id  右邊界
      • m_createor_trx_id  正在創(chuàng)建事務(wù)的事務(wù)ID
      • trx_ids 快照創(chuàng)建時,處于活動即尚未完成的讀寫事務(wù)的集合
    • 舉一個列子:新建一個快照,假設(shè)當(dāng)前事務(wù)的事務(wù)ID為6,這時候讀寫事務(wù)鏈上(這個是全局的)活動的事務(wù)有{3,5,6,10},不包括只讀事務(wù),那么調(diào)用方法創(chuàng)建快照時就會把{3,5,10}存儲到當(dāng)前的視圖中的trx_ids(6因為是當(dāng)前事務(wù)的ID,不記錄到視圖中),m_up_limit_id的值是3,m_low_limit__id是10,m_createor_trx_id是6
      • trx_id<m_up_limit_id 可見  意味著是快照之前發(fā)生的事務(wù)
      • trx_id>m_low_limit_id 不可見,意味著是快照之后發(fā)生的事務(wù)
      • trx_ids對應(yīng)的事務(wù)左右的修改還處于活動狀態(tài)即還沒有提交對當(dāng)前事務(wù)來說不可見
      • trx_id=m_createor_trx_id 可見
      • 公式:通過比較事務(wù)ID的值是否在[m_up_limit_id,m_low_limit_id]區(qū)間的左側(cè),中間,還是右側(cè)判斷是否可見
        • 左側(cè)  可見
        • 中間
          • 在trx_ids中不可見
          • 等于m_createor_trx_id 可見
        • 右側(cè)  不可見
  10. innodb的MVCC技術(shù)中的多版本是根據(jù)UNDO日志來實現(xiàn)了,我們在上面說過,DATA_ROLL_PTR ,表示舊版本的數(shù)據(jù)位于回滾段中的位置。DB_ROLL_PTR的結(jié)構(gòu)如下
    • MVCC詳細講解
  11. 多版本生成
    • 對于一個邏輯上的多版本生成過程,其方式如下
      • 最老的版本,一定是插入操作暫存到UNDO日志的版本(對于聚集索引,不是記錄的所有字段讀暫存到回滾段,而是主鍵信息被暫存)
      • 更新操作,把舊值存入UNDO日志。同一個日志反復(fù)被更新,則每次讀存入一個舊值(前像)到UNDO日志內(nèi),如此就會有多個版本,版本之間,使用DATA_POLL_PTR執(zhí)行根據(jù)的版本,由此所有版本構(gòu)成一個鏈表,鏈頭是索引上的記錄,鏈尾是首次插入時生成的UNDO信息。
      • 刪除操作,在UNDO日志中保存刪除標志
  12. 多版本查找
    • 對于聚集索引,可以根據(jù)DATA_ROLL_PTR就可以從回滾段中找出前一個版本的記錄,并知道此記錄是更新操作還是插入操作生成的,如果是插入操作生成的,則意味著此版本是最原始的版本,即使不可見也沒有必要在繼續(xù)回溯查找舊版本了
    • 但是查找的過程與隔離級別緊密相關(guān)
      • 如果是未提交讀隔離級別,根本不去找舊版本,在索引上讀到的記錄就被直接使用
      • 如果不是未提交隔離級別,則需要進入UNDO回滾段中根據(jù)DATA_POLL_PTR進行查找,還要判斷是否可見,如果可見,則返回,如果不可見,則一直根據(jù)DATA_POLL_PTR進行查找
    1. 有了前面的補充,我們看下是否能解釋前面step7出現(xiàn)的問題

      創(chuàng)新互聯(lián)建站服務(wù)項目包括鐵鋒網(wǎng)站建設(shè)、鐵鋒網(wǎng)站制作、鐵鋒網(wǎng)頁制作以及鐵鋒網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鐵鋒網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鐵鋒省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
      • MVCC詳細講解
      • MVCC詳細講解
      • 我們在T2的step8修改了id=1的title,但step 9,step10沒有看到,step9沒看到,大家不會有什么意外,因為step9對應(yīng)的事務(wù)ID小于step8的事務(wù)ID,但step10的事務(wù)ID是大于step8的事務(wù)ID的,那么我們來分析一下是什么造成的,我們這里不說undo log的格式,我們只需要知道根據(jù)undo log我們可以知道記錄的多個版本
      • 一開始,id=1的記錄是這樣的
      • MVCC詳細講解
      • T1的step4
        • m_up_limit_id=1,m_low_limit_id=1,m_createor_trx_id=1,trx_ids={},DATA_TRX_ID=0
        • DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側(cè),記錄可見
      • T2的step 5
        • m_up_limit_id=1,m_low_limit_id=2,m_createor_trx_id=2,trx_ids={1},DATA_TRX_ID=0
        • DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側(cè),記錄可見
      • T3的step 6
        • m_up_limit_id=1,m_low_limit_id=3,m_createor_trx_id=3,trx_ids={1,2},DATA_TRX_ID=0
        • DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側(cè),記錄可見
      • step7修改了數(shù)據(jù),這時候id=1的記錄是這樣的
        • MVCC詳細講解
      • T2的step8
        *m_up_limit_id=1,m_low_limit_id=2,m_createor_trx_id=2,trx_ids={1},DATA_TRX_ID=2
        • DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的中間位置,m_createor_trx_id=DATE_TRX_ID,因此可見。所以看到了title=‘商品1 push’的這一行
      • T1的step9
        • m_up_limit_id=1,m_low_limit_id=1,m_createor_trx_id=1,trx_ids={},DATA_TRX_ID=2
        • DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的右側(cè),記錄不可見
        • 那么接著通過DATE_ROLL_PTR,去undo找到了trx_id=0的這一行
        • DATA_TRX_ID=0,DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側(cè),記錄可見
      • step10
        • m_up_limit_id=1,m_low_limit_id=3,m_createor_trx_id=3,trx_ids={1,2},DATA_TRX_ID=2
        • DATA_TRX_ID在[m_up_limit_id,m_low_limit_id]的中間位置,并且在trx_ids中,記錄不可見
        • 接著通過DATE_ROLL_PTR,去undo找到了trx_id=0的這一行
        • DATA_TRX_ID=0, DATA_TRX_ID=0,DATA_TRX_ID<m_up_limit_id, 在[m_up_limit_id,m_low_limit_id]的左側(cè),記錄可見

      關(guān)于MVCC詳細講解就分享到這里了,希望以上內(nèi)容可以對大家有一定的參考價值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標題:MVCC詳細講解-創(chuàng)新互聯(lián)
當(dāng)前URL:http://www.rwnh.cn/article16/ceiddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、用戶體驗標簽優(yōu)化、企業(yè)建站關(guān)鍵詞優(yōu)化、自適應(yīng)網(wǎng)站

廣告

聲明:本網(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)

手機網(wǎng)站建設(shè)
峨眉山市| 独山县| 黄山市| 顺昌县| 张家川| 蒲城县| 开封县| 泗阳县| 洛宁县| 连山| 广南县| 睢宁县| 黔西| 客服| 固始县| SHOW| 朝阳区| 晋江市| 冕宁县| 民县| 嘉义市| 万州区| 海淀区| 溧阳市| 乡宁县| 金寨县| 张家口市| 色达县| 夏邑县| 区。| 陇西县| 定兴县| 昆明市| 聂拉木县| 龙口市| 松原市| 特克斯县| 波密县| 甘肃省| 峡江县| 赣州市|