国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Mysql MVCC實現(xiàn)

這篇具有很好參考價值的文章主要介紹了Mysql MVCC實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

并發(fā)事務(wù)可能產(chǎn)生的問題:

  • 讀+讀,并發(fā)讀不會有問題
  • 讀+寫,并發(fā)讀寫可能會發(fā)生臟讀、不可重復(fù)讀、幻讀
  • 寫+寫,并發(fā)修改同一行數(shù)據(jù),可能產(chǎn)生數(shù)據(jù)丟失(會滾丟失、覆蓋丟失)等問題

MVCC定義

MVCC(Mutil Version Concurrency Control)多版本并發(fā)控制,是一種并發(fā)訪問的機制(非具體實現(xiàn)),廣泛應(yīng)用于數(shù)據(jù)庫管理系統(tǒng),比如Mysql、Oracle、Postgresql等,實現(xiàn)對數(shù)據(jù)庫的并發(fā)訪問。本質(zhì)就是一行數(shù)據(jù)具有多個不同版本的記錄。

Mysql的InnoDB引擎實現(xiàn)了MVCC機制,用來處理讀寫沖突,做到非阻塞并發(fā)讀,提升并發(fā)效率。

快照讀和當前讀

當前讀

讀取的是記錄的最新版本,讀取時還要保證其他并發(fā)事務(wù)不能修改當前記錄,會對讀取的記錄進行加鎖

  • select lock in share mode(共享鎖) 讀讀不沖突、讀寫、寫寫沖突
  • select for update ; update, insert ,delete(排他鎖) 讀讀、讀寫、寫寫沖突

快照讀

顧名思義,就是讀取undo log中的某一版本的快照,讀到的數(shù)據(jù)可能不是最新的,但是可以不加鎖就可以讀到數(shù)據(jù)

  • 讀讀不沖突、讀寫不沖突
  • 寫寫沖突

MVCC實現(xiàn)原理

MVCC的目的就是多版本并發(fā)控制,在數(shù)據(jù)庫的實現(xiàn),就是為了解決讀寫沖突,它的實現(xiàn)原理主要依賴記錄中的3個隱式字段,undolog,Read View來實現(xiàn)的。

隱式字段

每行記錄除了我們自定義的字段之外,還有數(shù)據(jù)庫隱式定義的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段

  • BD_TRX_ID: 6byte,最近修改(修改/插入)的事務(wù)ID:記錄創(chuàng)建該記錄/最后一次修改該記錄的事務(wù)ID
  • DB_ROLL_PTR: 7byte,回滾指針,指向這條記錄的上一個版本(存儲在rollback segment里)
  • DB_ROW_ID: 6byte,隱含自增ID,如果數(shù)據(jù)表沒有主鍵,InnoDB會自動以DB_ROW_ID產(chǎn)生一個聚簇索引

Mysql MVCC實現(xiàn)

undo log

在修改數(shù)據(jù)的時候,會向 redo log 中記錄修改的頁內(nèi)容(為了在數(shù)據(jù)庫宕機重啟后恢復(fù)對數(shù)據(jù)庫的操作),也會向 undo log記錄數(shù)據(jù)原來的快照(用于回滾事務(wù))。undo log有兩個作用,除了用于回滾事務(wù),還用于實現(xiàn)MVCC

  • insert log:代表事務(wù)在 insert 新記錄時產(chǎn)生的 undo log, 只在事務(wù)回滾時需要,并且在事務(wù)提交后可以被立即丟棄
  • update undo log:事務(wù)在進行 update 或 delete 時產(chǎn)生的 undo log ; 不僅在事務(wù)回滾時需要,在快照讀時也需要;所以不能隨便刪除,只有在快速讀或事務(wù)回滾不涉及該日志時,對應(yīng)的日志才會被 purge 線程統(tǒng)一清除

版本鏈

1.插入一條記錄

Mysql MVCC實現(xiàn)

2.修改記錄

Mysql MVCC實現(xiàn)

  1. 加鎖
  2. copy到undo log,作為舊記錄(當前行的copy副本)
  3. 修改age,trx_id(從1開始遞增);回滾指針指向副本
  4. 提交事務(wù),釋放鎖
3.修改記錄

Mysql MVCC實現(xiàn)

  1. 加鎖
  2. copy到undo log,作為舊記錄(當前行的copy副本),已經(jīng)有undo log,此副本作為鏈表表頭插入的undo log的頭節(jié)點
  3. 修改age,trx_id(從1開始遞增);回滾指針指向副本
  4. 提交事務(wù),釋放鎖

Read View讀視圖

Read View是在對數(shù)據(jù)進行快照讀時,會產(chǎn)生的一個”一致性讀視圖“。

屬性:

  • m_ids:活躍事務(wù)id列表,當前系統(tǒng)中所有活躍的(也就是沒提交的)事務(wù)的事務(wù)id列表。
  • min_trx_id:m_ids 中最小的事務(wù)id。
  • max_trx_id:生成 ReadView 時,系統(tǒng)應(yīng)該分配給下一個事務(wù)的id(注意不是 m_ids 中最大的事務(wù)id),也就是m_ids 中的最大事務(wù)id + 1 。
  • creator_trx_id:生成該 ReadView 的事務(wù)的事務(wù)id。

這些屬性組成了當前事務(wù)的一致性視圖(Read View),而數(shù)據(jù)版本的可見性規(guī)則,就是基于數(shù)據(jù)的 row trx_id 和這個一致性視圖的對比結(jié)果得到的。

Read View可見性算法

把數(shù)據(jù)的最新記錄中的 DB_TRX_ID取出來,與Read View對比,如果不符合可見性,那就通過undo log 取下一個版本對比,直到找到滿足可見性的版本數(shù)據(jù)。
Mysql MVCC實現(xiàn)

  • 當【版本鏈中記錄的 trx_id 等于當前事務(wù)id(trx_id = creator_trx_id)】時,說明版本鏈中的這個版本是當前事務(wù)修改的,所以該快照記錄對當前事務(wù)可見。
  • 當【版本鏈中記錄的 trx_id 小于活躍事務(wù)的最小id(trx_id < min_trx_id)】時,說明版本鏈中的這條記錄已經(jīng)提交了,所以該快照記錄對當前事務(wù)可見。
  • 當【版本鏈中記錄的 trx_id 大于下一個要分配的事務(wù)id(trx_id > max_trx_id)】時,該快照記錄對當前事務(wù)不可見。
  • 當【版本鏈中記錄的 trx_id 大于等于最小活躍事務(wù)id】且【版本鏈中記錄的trx_id小于下一個要分配的事務(wù)id】(min_trx_id<= trx_id < max_trx_id)時,
    • 如果trx_id m_ids中,說明生成 ReadView 時,修改記錄的事務(wù)還沒提交,所以該快照記錄對當前事務(wù)不可見;
    • 如果trx_id不在m_ids中,說明生成該版本的事務(wù)已經(jīng)提交,對當前事務(wù)可見

隔離級別

  • 讀未提交(READ UNCOMMITTED)
  • 讀已提交(READ COMMITTED)
  • 可重復(fù)讀(REPEATABLE READ)
  • 串行化(SERIALIZABLE)

mvcc只在讀已提交和可重復(fù)讀兩種隔離級別生效文章來源地址http://www.zghlxwxcb.cn/news/detail-422663.html

  • 讀已提交
    • 事務(wù)開啟后,每次select都會生成一個Read View,可以讀到別的事務(wù)已經(jīng)提交的數(shù)據(jù)
  • 可重復(fù)讀
    • 事務(wù)開啟后,只在第一次select時生成Read View,之后的select都基于此視圖做可見性判斷。

長事務(wù)

為什么要避免長事務(wù)

  • 長事務(wù)可能存在很老的Read View,如下圖的事務(wù)1和2,這些視圖很可能訪問任何數(shù)據(jù),在這個事務(wù)提交前,它可能用到的回滾記錄都不能清理,需要保留,占用大量存在空間
  • 長事務(wù)占用鎖資源,長時間不釋放鎖,可能拖垮整個庫
    Mysql MVCC實現(xiàn)

到了這里,關(guān)于Mysql MVCC實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MySQL高階知識點(一)事務(wù)的并發(fā)問題和隔離級別

    簡單來說,事務(wù)就是要保證一組數(shù)據(jù)庫操作,要么全部成功,要么全部失敗。 在 MySQL 中,事務(wù)支持是在 引擎層 實現(xiàn)的。 MySQL 是一個支持多引擎的系統(tǒng),但并不是所有的引擎都支持事務(wù)。 如 MySQL 原生的 MyISAM 引擎就不支持事務(wù),這也是 MyISAM 被 InnoDB 取代的重要原因之一。

    2024年02月12日
    瀏覽(23)
  • MySQL 多版本并發(fā)控制 MVCC

    MySQL 多版本并發(fā)控制 MVCC

    事務(wù)的4個隔離級別以及對應(yīng)的三種異常 讀未提交( Read uncommitted ) 讀已提交( Read committed ):臟讀 可重復(fù)讀( Repeatable read ):不可重復(fù)讀 串行化( Serializable ):幻讀 臟讀:一個事務(wù)讀取到了另外一個事務(wù)沒有提交的數(shù)據(jù); 不可重復(fù)讀:在同一個事務(wù)中,兩次讀取同一

    2024年01月18日
    瀏覽(24)
  • 從 MySQL 的事務(wù) 到 鎖機制 再到 MVCC

    從 MySQL 的事務(wù) 到 鎖機制 再到 MVCC

    Java基礎(chǔ)合集 數(shù)據(jù)結(jié)構(gòu)與算法合集 設(shè)計模式合集 多線程合集 分布式合集 ES合集 其他系列文章導(dǎo)航 文章目錄 前言 一、事務(wù) 1.1 含義 1.2 ACID 二、鎖機制 2.1 鎖分類 2.2 隔離級別 三、MVCC 3.1 介紹 3.2 隔離級別 3.3 原理 四、總結(jié) 轉(zhuǎn)眼又一年~~2023馬上就要到尾聲了,在最后的幾天中

    2024年02月03日
    瀏覽(19)
  • Mysql進階-InnoDB引擎事務(wù)原理及MVCC

    Mysql進階-InnoDB引擎事務(wù)原理及MVCC

    事務(wù)是一組操作的集合,它是一個不可分割的工作單位,事務(wù)會把所有的操作作為一個整體一起向系 統(tǒng)提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。 ?事務(wù)的四大特性: 原子性(Atomicity):事務(wù)是不可分割的最小操作單元,要么全部成功,要么全部失敗

    2024年02月04日
    瀏覽(24)
  • MySQL的多版本并發(fā)控制(MVCC)

    MySQL的多版本并發(fā)控制(MVCC)

    MVCC MVCC,是Multiversion Concurrency Control的縮寫,翻譯過來是多版本并發(fā)控制,和數(shù)據(jù)庫鎖樣,他也是一種并發(fā)控制的解決方案 我們知道,在數(shù)據(jù)庫中,對數(shù)據(jù)的操作主要有2種,分別是讀和寫,而在并發(fā)場景下,就可能出現(xiàn)以下 旦三種情況:讀-讀并發(fā),讀-寫并發(fā),寫-寫并發(fā) 我

    2024年01月18日
    瀏覽(27)
  • 【Mysql】MVCC版本機制的多并發(fā)

    【Mysql】MVCC版本機制的多并發(fā)

    ??個人主頁:平凡的小蘇 ??學(xué)習(xí)格言:命運給你一個低的起點,是想看你精彩的翻盤,而不是讓你自甘墮落,腳下的路雖然難走,但我還能走,比起向陽而生,我更想嘗試逆風翻盤 。 ?? Mysql專欄 : Mysql內(nèi)功修煉基地 家人們更新不易,你們的??點贊??和?關(guān)注?真的對我

    2024年02月11日
    瀏覽(24)
  • MySQL多版本并發(fā)控制mvcc原理淺析

    MySQL多版本并發(fā)控制mvcc原理淺析

    1.mvcc簡介 1.1mvcc定義 mvcc(Multi Version Concurrency Control),多版本并發(fā)控制,是一種數(shù)據(jù)庫的并發(fā)控制機制。它用于管理事務(wù)并發(fā)執(zhí)行時對數(shù)據(jù)的訪問和修改,保證在多個事務(wù)同時對數(shù)據(jù)庫進行讀寫操作,不會出現(xiàn)數(shù)據(jù)不一致或丟失的情況 1.2mvcc解決的問題 當多個事務(wù)同時訪問數(shù)據(jù)

    2024年04月25日
    瀏覽(27)
  • 一文帶你了解MySQL之事務(wù)隔離級別和MVCC

    一文帶你了解MySQL之事務(wù)隔離級別和MVCC

    為了我們學(xué)習(xí)的順利進行,我們這邊創(chuàng)建一張 hero 表 這里需要注意的是,我們的 hero 表的主鍵是 number ,而不是 id ,主要是后邊要用到的 事務(wù)id 做一下區(qū)別,然后我們給這個表里插入一條數(shù)據(jù) 現(xiàn)在我們表里的數(shù)據(jù)就是這樣: 我們知道 MySQL 是 CS 架構(gòu)的軟件,若干個客戶端與

    2024年02月08日
    瀏覽(24)
  • 【MySQL高級篇筆記-多版本并發(fā)控制MVCC(下) 】

    【MySQL高級篇筆記-多版本并發(fā)控制MVCC(下) 】

    此筆記為尚硅谷MySQL高級篇部分內(nèi)容 目錄 一、什么是MVCC 二、快照讀與當前讀 1、快照讀? 2、當前讀 三、復(fù)習(xí) 1、再談隔離級別 2、隱藏字段、Undo Log版本鏈 四、MVCC實現(xiàn)原理之ReadView? 1、什么是ReadView? 2、設(shè)計思路 3、ReadView的規(guī)則 4、MVCC整體操作流程 五、舉例說明 1、READ

    2024年02月08日
    瀏覽(23)
  • MySQL事務(wù)(4種事務(wù)隔離級別、臟寫、臟讀、不可重復(fù)讀、幻讀、當前讀、快照讀、MVCC、事務(wù)指標監(jiān)控)

    顯示事務(wù): read write:讀寫事務(wù),默認模式,表示當前事務(wù)可以讀寫數(shù)據(jù)。 read only:只讀事務(wù),很少用,表示當前事務(wù)不能修改數(shù)據(jù)。 with consistent snapshot:一致性快照,在數(shù)據(jù)庫事務(wù)中確保事務(wù)在執(zhí)行過程中能看到一個事務(wù)開始時的一致數(shù)據(jù)庫狀態(tài),避免被其他并發(fā)操作影響

    2024年03月10日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包