搜尋
首頁資料庫mysql教程MySQL中MVCC機制是什麼

MySQL中MVCC機制是什麼

Jun 03, 2023 am 09:41 AM
mysqlmvcc

一、概述​​:

MVCC,全名為Multi-Version Concurrency Control,即多版本並發控制。 MVCC是一種多並發控制的方法,一般在資料庫管理系統中,實現對資料庫的並發訪問,在程式語言中實現事務記憶體。
我們知道,MySql在5.5後由MyISAM儲存引擎改成了InnoDB儲存引擎,主要是因為InnoDB是支援事務的,那麼當多執行緒同時執行的時候,可能會出現並發問題。這個時候可能會出現一個能夠控制並發的方法,MVCC就起到了這個作用。

MVCC主要靠undo log版本鏈與ReadView來實現。

二、什麼是Undo log

  • Undo log主要用於交易回溯時恢復原來的資料。

  • mysql在執行sql時,會將一天邏輯相反的日誌儲存到undo log。因此,undo log中記錄的也是邏輯日誌。

  • 但mysql執行Insert語句時,會在undo log日誌中記錄本次插入的主鍵id。等事務回滾時,delete刪除此id。

  • 在執行update語句時,MySQL會將修改前的資料保存在undo log中。等交易回滾時,再執行一次update,得到原來的資料。

  • 當MySQL執行delete語句時,會在undo log中儲存刪除前的資料。等事務回滾時,再執行insert,插入原來的資料。

  • 資料庫中的四大特性–原子性,即事務是不可分割的,要麼全部成功,要不全部失敗,其底層就靠undo log來實現。在執行某一條語句失敗時,就會對先前交易的語句進行回滾。

三、行的隱藏欄位

  • 在資料庫的每行上,除了存放真實的資料以外,還有3個隱藏的列:row_id、trx_id和roll_pointer

  • row_id,行號:

 如果目前表有整數型別的主鍵,那麼row_id的值就是主鍵的值
如果沒有整數類型的主鍵,則MySQL會按照欄位的順序選擇一個非空的整數類型的唯一索引為row_id
如果都沒有找到,則會建立一個自動增長的整數作為row_id

  • trx_id,交易號碼:

當一個交易開始執行前,MySQL就會為這個事務分配一個全域自增的事務id。
之後該事務對目前進行的增、改、刪除等操作時,都會將自己的事務ID記錄到trx_id中。

  • roll_pointer,回滾指標:

# 交易對目前資料變更時,會將舊的資料記錄到undo log中,在將資料寫入目前行,且目前的roll_pointer指向剛才那個undo log,因此可透過roll_pointer來找到改行前一個版本。
當一直有事務對該行改動時,就會一直產生undo log,最終將會形成undo log版本鏈。

四、Undo log版本鏈

一開始,我們使用以下語句建立一個stduent表

CREATE TABLE `student` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ) NOT NULL,
	`age` INT ( 11 ) NOT NULL,
  PRIMARY KEY ( `id` ) USING BTREE 
) ENGINE = INNODB;

現在開啟第一個事務,事務id為1 ,執行以下插入語句。

INSERT INTO student VALUES ( 1, "a", 24 );

那麼目前的示意圖如下:

MySQL中MVCC機制是什麼

因為該資料是新插入的,因此它的roll_pointer所指向的undo log為空。

接著開啟第2個事務,指派的事務id是2,執行下列修改指令。

UPDATE student SET NAME = 'b' WHERE id = 1;

現在的示意圖變成:

MySQL中MVCC機制是什麼

當開啟第3個事務,指派到事務id是3,執行下列修改指令。

UPDATE student SET age = 25 WHERE id = 1;

示意圖變成:

MySQL中MVCC機制是什麼

每個交易對該行進行改動時,都會產生一個undo log,用於保存先前的版本,之後再將新版的roll_pointer指向剛才產生的undo log。
因此,roll_pointer可以將這些不同版本的undo log串連起來,形成undo log的版本鏈。

五、關於ReadView

首先需要理解快照讀與目前讀
快照讀:簡單的select查詢,即不包含select … lock in share mode, select … for update,可能會讀到資料的歷史版本。
目前讀:以下語句都是目前讀,總是讀取最新版本,並且會對讀取的最新版本加鎖。

select ... lock in share mode
select ... for update
insert
update
delete

在交易執行每一個快照讀取或交易初次執行快照讀取時,會產生一致性視圖,即ReadView。
ReadView的作用是,判斷undo log版本鏈中的哪些資料對目前事務可見。

ReadView包含以下幾個重要的參數:

  • m_ids

    • 在建立ReadView的那一刻, mysql中所有未提交的事務id集合。

  • min_trx_id

    #
    • m_ids中的最小值

  • max_trx_id

    • mysql即将为下一个事务分配的事务id,并不是m_ids中的最大值。

  • creator_trx_id

    • 即创建此ReadView的事务id

简要的示意图如下:

MySQL中MVCC機制是什麼

那么事务在执行快照读时,可以通过以下的规则来确定undo log版本链上的哪个版本数据可见。

  • 如果当前undo log的版本的trx_id

  • 如果当前undo log的版本的trx_id≥max_trx_id,说明该版本对应的事务在生成ReadView之后才开始的,因此是不可见的。

  • 如果当前undo log的版本的trx_id∈[min_trx_id,max_trx_id),如果在这个范围里,还要判断trx_id是否在m_ids中:

  在m_ids中,说明版本对应的事务未提交,因此是不可见的。

  不在m_ids中,说明版本对应的事务已经提交,因此是可见的。
  • 如果当前undo log的版本的trx_id=creator_trxt_id,说明事务正在访问自己修改的数据,因此是可见的。

  • 当undo log版本链表的头结点数据被判定为不可见时,则利用roll_pointer找到上一个版本,再进行判断。如果整个链表中都没有找到可见的数据,则代表当前的查询找不到数据。

以上是MySQL中MVCC機制是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
在MySQL中使用視圖的局限性是什麼?在MySQL中使用視圖的局限性是什麼?May 14, 2025 am 12:10 AM

mysqlviewshavelimitations:1)他們不使用Supportallsqloperations,限制DatamanipulationThroughViewSwithJoinsOrsubqueries.2)他們canimpactperformance,尤其是withcomplexcomplexclexeriesorlargedatasets.3)

確保您的MySQL數據庫:添加用戶並授予特權確保您的MySQL數據庫:添加用戶並授予特權May 14, 2025 am 12:09 AM

porthusermanagementinmysqliscialforenhancingsEcurityAndsingsmenting效率databaseoperation.1)usecReateusertoAddusers,指定connectionsourcewith@'localhost'or@'%'。

哪些因素會影響我可以在MySQL中使用的觸發器數量?哪些因素會影響我可以在MySQL中使用的觸發器數量?May 14, 2025 am 12:08 AM

mysqldoes notimposeahardlimitontriggers,butacticalfactorsdeterminetheireffactective:1)serverConfiguration impactactStriggerGermanagement; 2)複雜的TriggerSincreaseSySystemsystem load; 3)largertablesslowtriggerperfermance; 4)highConconcConcrencerCancancancancanceTigrignecentign; 5); 5)

mysql:存儲斑點安全嗎?mysql:存儲斑點安全嗎?May 14, 2025 am 12:07 AM

Yes,it'ssafetostoreBLOBdatainMySQL,butconsiderthesefactors:1)StorageSpace:BLOBscanconsumesignificantspace,potentiallyincreasingcostsandslowingperformance.2)Performance:LargerrowsizesduetoBLOBsmayslowdownqueries.3)BackupandRecovery:Theseprocessescanbe

mySQL:通過PHP Web界面添加用戶mySQL:通過PHP Web界面添加用戶May 14, 2025 am 12:04 AM

通過PHP網頁界面添加MySQL用戶可以使用MySQLi擴展。步驟如下:1.連接MySQL數據庫,使用MySQLi擴展。 2.創建用戶,使用CREATEUSER語句,並使用PASSWORD()函數加密密碼。 3.防止SQL注入,使用mysqli_real_escape_string()函數處理用戶輸入。 4.為新用戶分配權限,使用GRANT語句。

mysql:blob和其他無-SQL存儲,有什麼區別?mysql:blob和其他無-SQL存儲,有什麼區別?May 13, 2025 am 12:14 AM

mysql'sblobissuitableForStoringBinaryDataWithInareLationalDatabase,而ilenosqloptionslikemongodb,redis和calablesolutionsolutionsolutionsoluntionsoluntionsolundortionsolunsonstructureddata.blobobobissimplobisslowdeperformberbutslowderformandperformancewithlararengedata;

mySQL添加用戶:語法,選項和安全性最佳實踐mySQL添加用戶:語法,選項和安全性最佳實踐May 13, 2025 am 12:12 AM

toaddauserinmysql,使用:createUser'username'@'host'Indessify'password'; there'showtodoitsecurely:1)choosethehostcarecarefullytocon trolaccess.2)setResourcelimitswithoptionslikemax_queries_per_hour.3)usestrong,iniquepasswords.4)Enforcessl/tlsconnectionswith

MySQL:如何避免字符串數據類型常見錯誤?MySQL:如何避免字符串數據類型常見錯誤?May 13, 2025 am 12:09 AM

toAvoidCommonMistakeswithStringDatatatPesInMysQl,CloseStringTypenuances,chosethirtightType,andManageEngencodingAndCollat​​ionsEttingSefectery.1)usecharforfixed lengengtrings,varchar forvariable-varchar forbariaible length,andtext/blobforlargerdataa.2 seterters seterters seterters

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具