日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql的MVCC是什么

發布時間:2025/3/11 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql的MVCC是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • MVCC是什么
      • MVCC的作用
      • MVCC的實現原理
      • Read View是什么
      • Read View如何判斷某個版本可以訪問

MVCC是什么

MVCC(Multiversion concurrency control)是同一行數據保留多版本的一種方式,進而實現并發控制。
在查詢時,通過read view和版本鏈找到對應版本的數據。

MVCC的作用

提升并發性能。對于高并發場景,MVCC比行級鎖開銷更小

MVCC的實現原理

MVCC的實現依賴于版本鏈,版本鏈通過表的三個隱藏字段實現:

  • DB_TRX_ID:當前事務id(唯一)
  • DB_ROLL_PRT:回滾指針,指向當前行記錄的上一個版本
  • DB_ROW_ID:主鍵,如果數據表沒有主鍵,InnoDB會自動生成主鍵
  • 表的某一行記錄示例

    它表示id=1,name=張三,age=19的這條行記錄是由事務id=10的事務創建/修改

    Read View是什么

    read view可以理解為將數據在每個時刻的狀態拍成“照片”記錄下來。當需要獲取時刻t的數據時,就從t時間拍的”照片“上獲取數據。
    Read View結構:

    Read View如何判斷某個版本可以訪問

  • trx_id == creator_trx_id:修改這條行記錄的事務如果和創建Read View(也就是查詢這條行記錄)的事務是同一個事務,那么就可以訪問這個版本的行記錄數據。
  • trx_id < min_trx_id:行記錄的事務id比未提交的最小事務id還要小。說明修改該行記錄的事務已經提交。該版本的事務可以被當前事務讀取到。
  • trx_id > max_trx_id:說明當前版本的事務是在生成Read View之后才產生,當前事務無法訪問。
  • min_trx_id <= trx_id <= max_trx_id:
  • 如果在m_ids中存在trx_id,說明是未提交的事務,不可訪問
  • 不存在,說明trx_id已經提交了,可以訪問。
  • 例如:
    有如下兩個事務

    事務id=20的事務將id=1的行記錄的name先改成李四,然后改成王五。
    事務id=60的事務對其他表進行一些操作。

    此時進行查詢select * from users where id = 1,生成的Read View如下圖:
    此時未提交的事務有20和60,所以m_ids為[20,60]
    生成該Read View的是查詢語句,所以creator_trx_id=0(一個事務只有對數據庫的數據進行修改操作(增,刪,改)的時候,才會為事務分配一個唯一事務id,查詢操作的事務沒有進行對數據進行修改操作,所以trx_id就是默認的0)

    將行記錄的每個版本的trx_id與時間軸對比,判斷此版本是否可以訪問

    此時查詢能查詢到的數據應該是name=“張三”,原因如下表:

    nametrx_id == creator_trx_idtrx_id < min_trx_idtrx_id > max_trx_idmin_trx_id <= trx_id <= max_trx_id結果
    王五符合,但在m_ids中無法訪問
    李四同上無法訪問
    張三符合可以訪問

    總結

    以上是生活随笔為你收集整理的Mysql的MVCC是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。