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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL MVCC 概述

發(fā)布時(shí)間:2025/3/12 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL MVCC 概述 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • MVCC(Muti Version Concurrency Control) 的概念
    • 什么是當(dāng)前讀和快照讀
    • 背景
    • 總結(jié)
  • undo 日志
  • InnoDB 中的 MVCC
    • InnoDB 中的 MVCC 與事務(wù)隔離級(jí)別的關(guān)系
    • InnoDB 中的 MVCC 實(shí)現(xiàn)原理

MVCC(Muti Version Concurrency Control) 的概念

MVCC, 是一種多版本并發(fā)控制機(jī)制。通過 MVCC ,可以極大地提升數(shù)據(jù)庫的操作并發(fā)量, 在不同的數(shù)據(jù)庫, 不同的存儲(chǔ)引擎中的實(shí)現(xiàn)方法也不一樣, 大都是基于樂觀鎖和悲觀鎖來實(shí)現(xiàn)的。

什么是當(dāng)前讀和快照讀

  • 當(dāng)前讀
    當(dāng)前讀意思就是讀取的是記錄的最新版本,讀取時(shí)還要保證其他并發(fā)事務(wù)不能修改當(dāng)前記錄, 會(huì)對(duì)讀取的記錄進(jìn)行加鎖。
    像 select lock in share mode(共享鎖), select for update, update, insert , delete(排他鎖),這些操作都是當(dāng)前讀的一種。
  • 快照讀
    快照讀即不加鎖的非阻塞讀, 讀取的是當(dāng)前事務(wù)下第一次執(zhí)行 select 時(shí)最新的版本, 注意區(qū)別, 這里的當(dāng)前事務(wù)下第一次執(zhí)行 select 時(shí)最新的版本并不能保證是最新的版本,如果在當(dāng)前事務(wù)下執(zhí)行第一次 select 之后, 有其他事務(wù)對(duì)記錄進(jìn)行了修改并提交,則當(dāng)前讀的記錄版本則變成了歷史版本。
    快照讀的前提是事務(wù)隔離級(jí)別不是串行級(jí)別, 串行下的快照讀將會(huì)退化成當(dāng)前讀。快照讀是基于提高并發(fā)性能考慮的,是基于 MVCC 來實(shí)現(xiàn)的。

背景

最早的數(shù)據(jù)庫系統(tǒng),只有讀讀之間可以并發(fā),讀寫,寫讀,寫寫之間都要阻塞。在引入 MVCC 之后,只有寫寫之間相互阻塞,其他的三種操作都可以并行,這樣大幅度提高了 InnoDB 的并發(fā)量。

總結(jié)

MVCC 就是為了實(shí)現(xiàn)讀-寫沖突不加鎖, 將當(dāng)前讀變成了快照讀。當(dāng)前讀實(shí)際上是一種加鎖的操作,是悲觀鎖的實(shí)現(xiàn)。 MVCC 的核心理念就是維持一條記錄的多個(gè)版本, 使得讀寫操作沒有沖突。

undo 日志

undo log 主要分為兩種:

  • insert undo log
    代表事務(wù)在 insert 新記錄時(shí)產(chǎn)生的 undo log, 只在事務(wù)回滾時(shí)需要,并且在事務(wù)提交后可以被立即丟棄。
  • update undo log
    代表事務(wù)在進(jìn)行 updatedelete 時(shí)產(chǎn)生的 undo log ,不僅在事務(wù)回滾時(shí)需要,在快照讀時(shí)也需要,所以不能隨便刪除,只有在快照讀或事務(wù)回滾不涉及該日志時(shí),對(duì)應(yīng)的日志才會(huì)被 purge 線程同一清除。
    關(guān)于 MySQL purge 線程的介紹,請(qǐng)移步 MySQL purge 線程.md

InnoDB 中的 MVCC

InnoDB 中的 MVCC 與事務(wù)隔離級(jí)別的關(guān)系

MySQ 中支持 MVCC 的引擎是 InnoDB,且 MVCC 只在 READ_COMMITED 和 REPEATABLE_READ 兩個(gè)隔離級(jí)別下工作。
MVCC 的作用用簡單的話概括就是對(duì)數(shù)據(jù)庫的任何修改的提交都不會(huì)直接覆蓋之前的數(shù)據(jù),而是產(chǎn)生一個(gè)新的版本與老版本共存,使得讀數(shù)據(jù)的時(shí)候可以完全不用加鎖。這樣讀某一個(gè)數(shù)據(jù)時(shí),事務(wù)可以根據(jù)當(dāng)下的隔離級(jí)別來選擇讀取哪個(gè)版本的數(shù)據(jù),這個(gè)過程中完全不需要加鎖。所以根據(jù)這個(gè)思想,實(shí)現(xiàn)兩個(gè)隔離級(jí)別就變得非常容易:

  • READ_COMMITTED: 一個(gè)事務(wù)讀取數(shù)據(jù)時(shí)總是讀取這個(gè)數(shù)據(jù)最近一次被 commit 的版本。
  • REPEATABLE_READ: 一個(gè)事務(wù)讀取數(shù)據(jù)時(shí)總是讀取當(dāng)前事務(wù)開始之前最后一次被 commit 的版本。

InnoDB 中的 MVCC 實(shí)現(xiàn)原理

InnoDB 中每行有三個(gè)隱藏列:

  • 6Byte, DB_TRX_ID : 行事務(wù) ID, 記錄的是上一次記錄增刪改被提交后的事務(wù) ID, 就是被經(jīng)常提起的創(chuàng)建版本號(hào)刪除版本號(hào);
  • 7Byte, DB_ROLL_PTR : 回滾指針, 指向 undo_log, undo_log 存儲(chǔ)于 rollback segment 區(qū)域, 用于保存事務(wù)開始之前的快照;
  • 6Byte, DB_ROW_ID : 行 ID, 可以理解為隱藏的主鍵, 插入新行時(shí)單調(diào)遞增。

總結(jié)

以上是生活随笔為你收集整理的MySQL MVCC 概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。