MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理
前言
MVCC全稱為Multi Version Concurrency Control
,直譯為多版本并發(fā)控制
,是MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫的讀寫性能,用更好的方式去處理讀寫沖突。
什么是當(dāng)前讀和快照讀?
在講述MVCC機(jī)制實(shí)現(xiàn)原理之前,我們先了解一下當(dāng)前讀和快照讀
當(dāng)前讀:
其實(shí)也很容易理解,當(dāng)前讀指的就是讀取的是最新的記錄,讀取的時(shí)候還需要保證其他事務(wù)不能修改當(dāng)前記錄,所以會對讀取的記錄進(jìn)行加鎖處理
例如:select for update 、update、insert、delete這些操作都是當(dāng)前讀
快照讀:
而快照讀也就是不加鎖的select,不過需要注意的是快照讀的前提是隔離級別不能是serializable(可串行化),之所以出現(xiàn)快照讀,是基于提高并發(fā)性能的考慮
其實(shí)可以簡單理解成MVCC就是為了實(shí)現(xiàn)讀寫沖突的時(shí)候不去加鎖
MVCC的實(shí)現(xiàn)原理
其實(shí)在MySQL中每一條記錄都會有一些隱藏字段,而在MVCC機(jī)制中,用處最大的就是trx_id
,roll_pointer
分別代表著操作這條記錄的事務(wù)的事務(wù)ID,和回滾指針(指向當(dāng)前記錄行的undo log信息),倘若這條記錄沒有主鍵,還包含一個(gè)隱含的主鍵ID
在每一個(gè)事務(wù)開啟之前,都會先從數(shù)據(jù)庫中拿到一個(gè)自增的事務(wù)ID
對于undo log
很明顯這就是一個(gè)日志文件,記錄著insert、update、delete,我們在進(jìn)行刪除的時(shí)候,其實(shí)innodb引擎并沒有真正的刪除,其實(shí)是將一個(gè)記錄的一個(gè)隱含字段修改了,讓我們?nèi)ニ阉鞯臅r(shí)候搜索不到,所以我們可以知道在undo log中只存在兩種日志,一種是insert undo log
,一種是update undo log
undo log的作用就是為了保存版本鏈,而前面我們說的roll_pointer
這個(gè)字段就是指向的這里
為了保證可見性,當(dāng)事務(wù)發(fā)起快照讀的時(shí)候,就會產(chǎn)生一個(gè)Read View(讀視圖),Read View 保存了當(dāng)前事務(wù)開啟時(shí)所有活躍的事務(wù)列表,或者可以理解為保存了其他事務(wù)的ID列表
Read View有幾個(gè)重要屬性:
- trx_ids:當(dāng)前系統(tǒng)中活躍的事務(wù)ID
- low_limit_id:目前出現(xiàn)的最大的事務(wù)ID+1,也就是下一個(gè)將被分配的事務(wù)ID
- up_limit_id:活躍事務(wù)列表中最小的id
- creator_trx_id:當(dāng)前事務(wù)的ID
而對于Read View的可見性規(guī)則:
- 如果訪問版本事務(wù)id = creator_trx_id 那么證明該事務(wù)操作的就是自己修改過的記錄
- 如果訪問版本事務(wù)id < up_limit_id 那么證明生成該版本的事務(wù)已經(jīng)提交
- 如果訪問版本事務(wù)id > low_limit_id,那么表示生成該版本的事務(wù)還沒有提交不能被訪問
- 如果訪問版本事務(wù)id > up_limit_id 且 id < low_limit_id,那么判斷該事務(wù)id是否在活躍列表中,如果在證明還未提交不能被訪問,反之亦然
到此這篇關(guān)于MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)MySQL MVCC機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL5.6下windows msi安裝詳細(xì)介紹
這篇文章主要介紹了MySQL5.6下windows msi安裝詳細(xì)介紹,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08mysql 臨時(shí)表 cann''t reopen解決方案
MySql關(guān)于臨時(shí)表cann't reopen的問題,本文將提供詳細(xì)的解決方案,需要了解的朋友可以參考下2012-11-11SQL?ALTER?TABLE語句靈活修改表結(jié)構(gòu)和數(shù)據(jù)類型
這篇文章主要介紹了SQL?ALTER?TABLE語句靈活修改表結(jié)構(gòu)和數(shù)據(jù)類型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12MySQL json相關(guān)函數(shù)及功能詳解
MySQL提供了一系列的JSON函數(shù),用于解析、提取、修改和操作JSON數(shù)據(jù),以下是一些常用的JSON函數(shù)及其功能,需要的朋友可以參考下2023-11-11Xtrabackup使用指南 InnoDB數(shù)據(jù)備份工具
Xtrabackup是一個(gè)對InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品2011-10-10