激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL的多版本并發控制MVCC的實現

MySQL的多版本并發控制MVCC的實現

2022-02-15 21:03扭轱轆胖虎 Mysql

MVCC就是多版本并發控制,本文主要介紹了MySQL的多版本并發控制MVCC的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是MVCC

MVCC就是多版本并發控制。

MySQL的事務型存儲引擎通過多版本并發控制(MVCC)來提升并發性能。

可以認為MVCC是行級鎖的一個變種,但是它在大多數情況下避免了加鎖操作,同時實現非阻塞的讀操作,因此開銷更低。

MVCC是通過保存數據在某個時間點的快照來實現的,核心思想就是保存數據的歷史版本,通過對數據行的多個版本管理來實現數據庫的并發控制。

這樣我們就可以通過比較版本號決定數據是否顯示出來,讀取數據的時候不需要加鎖也可以保證事務的隔離效果。

MVCC的實現

實際上,InnoDB 會在每行記錄后面增加三個隱藏字段:

  • ROW_ID:行ID,隨著插入新行而單調遞增,如果有主鍵,則不會包含該列。
  • TRX_ID:記錄插入或更新該行的事務的事務ID。
  • ROLL_PTR:回滾指針,指向 undo log 記錄。每次對某條記錄進行改動時,該列會存一個指針,可以通過這個指針找到該記錄修改前的信息。當某條記錄被多次修改時,該行記錄會存在多個版本,通過 ROLL_PTR 鏈接形成一個類似版本鏈的概念。

MySQL的多版本并發控制MVCC的實現

以 RR 級別為例:

每開啟一個事務時,系統會給該事務分配一個事務 Id,在該事務執行第一 個 select 語句的時候,會生成一個當前時間點的事務快照 ReadView,主要包含以下幾個屬性:

  • m_ids:表示生成ReadView時,當前系統中未提交的讀寫事務的事務id列表。
  • min_trx_id:表示生成ReadView時,當前系統中未提交的讀寫事務中最小的事務id,也就是m_ids中的最小值。
  • max_trx_id:表示生成ReadView時,系統中應該分配給下一個事務的id值。
  • creator_trx_id:表示生成ReadView時,該事務的事務id。

有了這個 ReadView,這樣在訪問某條記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:

  • trx_id == creator_trx_id:可以訪問這個版本。
  • trx_id < min_trx_id :可以訪問這個版本。
  • trx_id > max_trx_id:不可以訪問這個版本。
  • min_trx_id <= trx_id <= max_trx_id :如果trx_id是在m_ids中,不可以訪問這個版本,反之可用。

在進行判斷時,首先會拿記錄的最新版本來比較,如果該版本無法被當前事務看到,則通過記錄的 ROLL_PTR 找到上一個版本,重新進行比較,直到找到一個能被當前事務看到的版本。
而對于刪除,其實就是一種特殊的更新,InnoDB 用一個額外的標記位 delete_bit 標識是否刪除。當我們在進行判斷時,會檢查下 delete_bit 是否被標記,如果是,則跳過該版本,通過 ROLL_PTR 拿到下一個版本進行判斷。

以上內容是對于 RR 級別來說,而對于 RC 級別,其實整個過程幾乎一樣,唯一不同的是生成 ReadView 的時機, RR 級別只在事務開始時生成一次,之后一直使用該 ReadView。而 RC 級別則在每次 select 時,都會生成一個 ReadView。

MVCC 有沒有解決幻讀?

幻讀:在一個事務中使用相同的 SQL 進行兩次讀取,第二次讀取到了其他事務新插入的行。
例如:

1)事務 1 第一次查詢:select * from user where id < 10 時查到了 id = 1 的數據

2)事務 2 插入了 id = 2 的數據

3)事務 1 使用同樣的語句第二次查詢時,查到了 id = 1、id = 2 的數據,出現了幻讀。

談到幻讀,首先我們要引入“當前讀”和“快照讀”的概念。

  • 快照讀:生成一個事務快照(ReadView),之后都從這個快照獲取數據。普通 select 語句就是快照讀。
  • 當前讀:讀取數據的最新版本。常見的 update/insert/delete、還有 select ... for update、select ... lock in share mode 都是當前讀。

對于快照讀,MVCC 因為從 ReadView 讀取,所以必然不會看到新插入的行,所以天然就解決了幻讀的問題。

而對于當前讀的幻讀,MVCC 是無法解決的。需要使用 Gap Lock 或 Next-Key Lock(Gap Lock + Record Lock)來解決。

其實原理也很簡單,用上面的例子稍微修改下以觸發當前讀:

?
1
select * from user where id < 10 for update

當使用了 Gap Lock 時,Gap 鎖會鎖住 id < 10 的整個范圍,因此其他事務無法插入 id < 10 的數據,從而防止了幻讀。

到此這篇關于MySQL的多版本并發控制MVCC的實現的文章就介紹到這了,更多相關MySQL多版本并發控制MVCC內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7045589152296861704

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 涩涩激情网| 久草视频在线资源 | 伊人午夜 | 一级黄色性感片 | h视频在线免费观看 | 国产精品久久久av | 国产午夜电影在线观看 | 久久伊 | 一级成人免费 | 国产瑟瑟视频 | 看免费5xxaaa毛片 | 国产日韩一区二区三区在线观看 | 久久亚洲网 | 色网站在线免费观看 | 黄色影院一级片 | 中文字幕在线免费播放 | 亚洲第一激情网 | 一级片久久免费 | 欧美激情猛片xxxⅹ大3 | 久久精品亚洲一区二区三区观看模式 | 黄色视频a级毛片 | 久久夜夜视频 | 亚州视频在线 | 在线91视频| 亚洲国产一区二区三区 | 4480午夜| 国产精品一区二区羞羞答答 | 黄色一级电影网 | 免费福利在线视频 | 国产日产精品久久久久快鸭 | 免费看成年人视频在线 | 黄色免费在线视频网站 | 久久精品性视频 | 在线成人免费视频 | 免费在线观看国产 | 精国品产一区二区三区有限公司 | 久久伊人精品视频 | 日本一区视频在线播放 | 男女亲热网站 | 成人福利在线免费观看 | 黄色成人av在线 |