【高并發基礎】理解MVCC及提煉實現思想-創新互聯

文章目錄
    • 1. 前言
    • 2. MVCC 概念
      • 2.1 MVCC 版本鏈
      • 2.2 MVCC trx_id
      • 2.3 MVCC Read View
    • 3. 提出問題
    • 4. 解決問題
      • 4.1 不讀未提交的數據
        • 4.1.1 一般的并發情況
        • 4.1.2 特殊的并發情況
        • 4.1.3 剩下的并發情況
      • 4.2 如果自己修改了數據,要第一時間讀到
    • 5. MySQL RC 使用 MVCC
      • 5.1 MVCC DML 會生成新的 Read View 嗎?
      • 5.2 MySQL RC 建立 Read View 的時機
    • 6. MySQL RR 使用 MVCC
      • 6.1 MySQL RR 建立 Read View 的時機
    • 7. 提煉 MVCC 的思想
    • 8. 后記

成都創新互聯公司于2013年開始,是專業互聯網技術服務公司,擁有項目成都網站設計、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元涇縣做網站,已為上家服務,為涇縣各地企業和個人服務,聯系電話:189820811081. 前言

MVCC 在 MySQL、Oracle、PostgreSQL 都有應用,用于實現事務的隔離特性。現在結合 《MySQL是怎樣運行的》的內容理解、歸納、整理下MVCC的實現及思想。

2. MVCC 概念

Multiversion Concurrency Control 對版本并發控制。
對于同一行數據,會根據不同事務的DML操作參生不同的版本,讓不同事務各自維護自己能看到的版本從而做到事務隔離。

2.1 MVCC 版本鏈

每次操作數據庫都會生成日志,那么就可以把同一條記錄的多次操作記錄按時間順序鏈接起來。
在這里插入圖片描述

以上圖片參考博客

2.2 MVCC trx_id

按事務開啟的時間順序,為事務頒發一個Id,從而維護“版本”。是討論MVCC實現的基礎。

2.3 MVCC Read View

光有日志記錄還不夠,每個事務應該要維護自己的 “視野范圍”。也就是當前事務到底能看到什么版本的數據,建立 Read View,并與版本鏈協作,就能約束事務的視野,從而實現隔離。
Read View 包含:

  1. m_ids
  2. min_trx_id
  3. max_trx_id
  4. creator_trx_id

Read View 里面有多個屬性,他們是分別用于解決不同問題的。如果一上來就把四個都搞懂,容易暈。

3. 提出問題

這個事務隔離方案需要回答以下問題:

  • 如何控制當前事務讀不到其他事務 未提交 的數據
  • 如果自己事務修改了數據,怎么第一時間讀到

回答以上問題后,也順帶把MySQLRCRR使用MVCC的原理給理解了

4. 解決問題

我們把日志的 trx_id 與 區間 [min_trx_id, max_trx_id ] 的命中關系羅列出來,用于后續討論問題

trx_id >= Read View. max_trx_id
Read View. max_trx_id  >trx_id  >=  Read View. min_trx_id
trx_id< Read View. min_trx_id

值得一提的是,

trx_id == Read View. creator_trx_id

不在區間討論范圍,屬于前置判斷(這個條件滿足了,就不看區間命中情況了)

4.1 不讀未提交的數據 4.1.1 一般的并發情況

新引入以下參數:

  • max_trx_id:這個屬性容易搞混,它表示系統應該分配給下一個事務的食物Id
    • 即若 creator_trx_id = 3,max_trx_id 一定 >3

事務生成了 Read View 之后,對數據行進行讀取,發現日志中有

trx_id >= Read View. max_trx_id

則說明該日志發生在建立 Read View 之后,并且生成該日志的事務是在當前事務之后開啟。
至此,我們能夠得到一個信息:該日志發生在當前事務開啟之后,可能是還未提交的事務
那么,爭取不讀未提交的事務,只用做一件事:忽略該日志


4.1.2 特殊的并發情況

新引入兩個參數

  • min_trx_id: 當前所有事務中,活躍的(未提交的)事務中 trx_id 最小的一個
  • m_ids: 當前所有事務中,活躍的(未提交的)事務列表

事務生成了 Read View 之后,對數據行進行讀取,發現日志中有

Read View. max_trx_id  >trx_id  >=  Read View. min_trx_id

則說明該日志發生在建立 Read View 之后,并且生成該日志的事務是在當前事務之后開啟。
對比上文的"一般的情況",max_trx_id指系統下一個要建立的事務Id,若存在以下關系:

Read View. max_trx_id  >trx_id

說明該日志的事務跟建立 Read View 的時機挨得很近,我們還是可以考慮一下這條日志。具體怎么考慮呢?
m_ids 在 Read View 中負責記錄建立 Read View 那一刻的 活躍事務。
如果日志中的 trx_id 不在活躍事務列表,側面說明該日志的事務已經提交,則可以讀取它。


4.1.3 剩下的并發情況
trx_id< Read View. min_trx_id

這個比較簡單,直接讀即可。由于較新的日志一定會置頂,讀到 trx_id< Read View. min_trx_id 立馬返回數據即可。


4.2 如果自己修改了數據,要第一時間讀到

引入以下參數

  • creator_trx_id: Read View 中事務的DML操作會觸發建立 trx_id (事務id)
trx_id == Read View. creator_trx_id

該日志是當前事務的最新語句創建的,直接讀取即可。該判斷放在了區間命中討論之前,所以一定會先讀到自己更新的數據。
如果開啟一個事務,該事務一直沒有DML操作,creator_trx_id = 0,即永遠不會出現

trx_id == Read View. creator_trx_id
5. MySQL RC 使用 MVCC

MySQL 會對每個查詢語句生成 Read View。

5.1 MVCC DML 會生成新的 Read View 嗎?

并不會,DML語句操作語句交給鎖處理了,MVCC只是控制讀取的數據的版本。
那么DML跟Read View無關嗎,當然也不是,上文交代,使用 creator_trx_id 登記自己操作了的數據。

5.2 MySQL RC 建立 Read View 的時機

每個讀取操作都會建立一個新的 Read View, 所以存在不可重復讀的并發隱患。

6. MySQL RR 使用 MVCC

RR 的隔離級別比 RC 高,其中隔離性的提高本質上就是調整了 Read View 創建的時機

6.1 MySQL RR 建立 Read View 的時機

第一個查詢語句生成 Read View,后續的所有查詢都 復用這個 Read View,所以每次讀取的值,都來源于同一個版本。

7. 提煉 MVCC 的思想

MVCC 在保持隔離性的前提下,盡大努力去讀最新的數據。它不會立即判斷數據是未提交的,而是記錄下建立 Read View 那一剎那的事務并發情況,交由一套算法去甄別。

  • 懷疑日志是未提交的數據

    • 自己DML操作的數據
      • 由 creator_trx_id 跟進記錄并讀取
    • 其他事務DML操作的數據
      • 由 trx_id 與 區間 [min_trx_id, max_trx_id ] 的命中關系確認為已提交數據則讀取
  • 確認日志是已提交的數據

    • 讀最新的版本

上文說的日志,是因為日志承載的是一個思想,MySQL是用 undo log支撐MVCC的,而PostgreSQl則不是。

8. 后記

早期寫的 InnoDB 如何避免臟讀和不可重復讀,是不嚴謹的地方,現在糾正過來,希望持續學習,不斷進步。
MVCC 給我的啟示是,我們可以嘗試用區間命中的思想去分解問題,當命中關系被完全覆蓋,我們可以認為問題被分解完成。

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網站題目:【高并發基礎】理解MVCC及提煉實現思想-創新互聯
網站地址:http://m.kartarina.com/article46/cdsseg.html

成都網站建設公司_創新互聯,為您提供網站建設網站排名關鍵詞優化外貿建站網站設計公司定制網站

廣告

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

成都定制網站建設
主站蜘蛛池模板: 免费A级毛片无码A| 日韩人妻精品无码一区二区三区| 亚洲成a人片在线观看无码 | 狠狠躁狠狠爱免费视频无码| 免费人妻av无码专区| 无码一区二区三区老色鬼| 无码乱肉视频免费大全合集| 伊人久久大香线蕉无码麻豆| 无码av免费一区二区三区试看| 国产精品va无码二区| 99无码精品二区在线视频| 亚洲一级特黄无码片| 亚洲熟妇无码AV| 日韩人妻无码一区二区三区久久| 精品无码中文视频在线观看| 精品无码国产自产拍在线观看 | 无码专区6080yy国产电影| 无码137片内射在线影院| 免费无码又爽又刺激一高潮| 精品无码人妻一区二区三区18| 亚洲AV无码专区国产乱码电影| 久青草无码视频在线观看| 亚洲AV无码一区二区三区电影| 无码精品A∨在线观看| 亚洲自偷自偷偷色无码中文| 亚洲AV无码一区二区三区鸳鸯影院| 日韩人妻精品无码一区二区三区 | 欧洲Av无码放荡人妇网站 | 精品欧洲av无码一区二区三区| 亚洲午夜国产精品无码老牛影视| 日韩成人无码影院| 无码国产成人午夜电影在线观看| 在线看片无码永久免费aⅴ| 亚洲精品自偷自拍无码| 亚洲日韩精品无码专区加勒比 | 国产成人无码区免费A∨视频网站 国产成人无码午夜视频在线观看 国产成人无码精品一区不卡 | 手机在线观看?v无码片| 无码A级毛片日韩精品| 特级无码毛片免费视频| 亚洲 无码 在线 专区| 精品无人区无码乱码毛片国产|