亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中MVCC機制的實現(xiàn)原理

 更新時間:2022年08月10日 09:44:48   作者:亞雷  
這篇文章主要介紹了MySQL中MVCC機制的實現(xiàn)原理,MVCC多版本并發(fā)控制,MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫的讀寫性能,用更好的方式去處理讀寫沖突

前言

MVCC全稱為Multi Version Concurrency Control,直譯為多版本并發(fā)控制,是MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫的讀寫性能,用更好的方式去處理讀寫沖突。

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

在講述MVCC機制實現(xiàn)原理之前,我們先了解一下當(dāng)前讀和快照讀

當(dāng)前讀:

其實也很容易理解,當(dāng)前讀指的就是讀取的是最新的記錄,讀取的時候還需要保證其他事務(wù)不能修改當(dāng)前記錄,所以會對讀取的記錄進行加鎖處理

例如:select for update 、update、insert、delete這些操作都是當(dāng)前讀

快照讀:

而快照讀也就是不加鎖的select,不過需要注意的是快照讀的前提是隔離級別不能是serializable(可串行化),之所以出現(xiàn)快照讀,是基于提高并發(fā)性能的考慮

其實可以簡單理解成MVCC就是為了實現(xiàn)讀寫沖突的時候不去加鎖

MVCC的實現(xiàn)原理

其實在MySQL中每一條記錄都會有一些隱藏字段,而在MVCC機制中,用處最大的就是trx_id,roll_pointer分別代表著操作這條記錄的事務(wù)的事務(wù)ID,和回滾指針(指向當(dāng)前記錄行的undo log信息),倘若這條記錄沒有主鍵,還包含一個隱含的主鍵ID

在每一個事務(wù)開啟之前,都會先從數(shù)據(jù)庫中拿到一個自增的事務(wù)ID

對于undo log很明顯這就是一個日志文件,記錄著insert、update、delete,我們在進行刪除的時候,其實innodb引擎并沒有真正的刪除,其實是將一個記錄的一個隱含字段修改了,讓我們?nèi)ニ阉鞯臅r候搜索不到,所以我們可以知道在undo log中只存在兩種日志,一種是insert undo log,一種是update undo log

undo log的作用就是為了保存版本鏈,而前面我們說的roll_pointer這個字段就是指向的這里

為了保證可見性,當(dāng)事務(wù)發(fā)起快照讀的時候,就會產(chǎn)生一個Read View(讀視圖),Read View 保存了當(dāng)前事務(wù)開啟時所有活躍的事務(wù)列表,或者可以理解為保存了其他事務(wù)的ID列表

Read View有幾個重要屬性:

  • trx_ids:當(dāng)前系統(tǒng)中活躍的事務(wù)ID
  • low_limit_id:目前出現(xiàn)的最大的事務(wù)ID+1,也就是下一個將被分配的事務(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機制的實現(xiàn)原理的文章就介紹到這了,更多相關(guān)MySQL MVCC機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論