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

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

這篇具有很好參考價值的文章主要介紹了MySQL多版本并發(fā)控制mvcc原理淺析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.mvcc簡介
1.1mvcc定義

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

1.2mvcc解決的問題

當多個事務同時訪問數(shù)據(jù)庫中的相同數(shù)據(jù)時,可能會有幾種情況:

  • 讀:多個事務都是讀操作,不會產(chǎn)生并發(fā)問題
  • 讀+寫:事務有讀有寫,那么會產(chǎn)生臟讀、不可重復讀、幻讀的問題
  • 寫:多個事務同時寫,可能會產(chǎn)生數(shù)據(jù)丟失、覆蓋等問題

針對以上問題,在讀+寫的情況下,通常需要加鎖來解決問題,mysql的innodb實現(xiàn)了mvcc來更好的處理讀寫沖突,做到不用加鎖,實現(xiàn)非阻塞并發(fā)讀

在都是寫操作的情況下,只能通過加鎖的方式解決。

1.3當前讀與快照讀

當前讀:讀取的是最新版本的數(shù)據(jù),保證讀取時不會有其他事務修改數(shù)據(jù),需要對記錄加鎖

加共享鎖,讀不受影響,寫會被阻塞

select ... lock in share mode;

加排他鎖,讀和寫都被阻塞(快照讀不受影響)

select ... for update;

更新、插入、刪除操作以及串行化隔離級別都是當前讀

快照讀:每一次修改數(shù)據(jù),都會在undolog中存有原始記錄(快照),快照讀就是讀取某一版本的記錄。這種方式能夠不加鎖讀數(shù)據(jù),但是可能會讀到舊的數(shù)據(jù)。一般的查詢都是快照讀

select * from tablename;
2.mvcc原理

mvcc主要通過行記錄中的隱藏字段、undolog和readview實現(xiàn)的

2.1隱藏字段

mysql中,在每一行記錄中除了自定義的字段,還有3個隱藏的字段(innodb引擎)

  1. row_id:如果表沒有自定義主鍵,那么會自動生成row_id作為主鍵
  2. trx_id:記錄修改、新增這條記錄的事務id
  3. roll_pointer:回滾指針,指向當前記錄的上一個版本
2.2版本鏈

在修改數(shù)據(jù)時,mysql會向undolog中記錄數(shù)據(jù)原來的快照,用于進行回滾操作。undolog還能用來實現(xiàn)mvcc

如以下例子,mvcc生成版本鏈:

當事務1001(trx_id=1001)執(zhí)行了 insert into user values(1,'竹子',23) 之后:

MySQL多版本并發(fā)控制mvcc原理淺析,mysql,mysql,數(shù)據(jù)庫

當事務1002(trx_id=1002)執(zhí)行了 update user set name='竹筍' where id=1 之后:

MySQL多版本并發(fā)控制mvcc原理淺析,mysql,mysql,數(shù)據(jù)庫

當事務1003(trx_id=1003)執(zhí)行了 update user set name='竹葉' where id=1 之后:

MySQL多版本并發(fā)控制mvcc原理淺析,mysql,mysql,數(shù)據(jù)庫

可以看到,不同版本的數(shù)據(jù)被指針連接起來形成了一個鏈表。

當我們要讀取時,如何判斷該讀取哪個版本呢?這就與生成的讀視圖有關了。

2.3ReadView

讀視圖用于決定事務可以讀到哪個版本的數(shù)據(jù)

它包含以下主要信息:

  1. trx_ids:當前mysql中所有活躍的事務id集合(沒提交或回滾的事務集)
  2. low_limit_id:當前出現(xiàn)的最大的事務id+1,表示下一個要分配的事務id
  3. up_limit_id:當前活躍的事務id集合中,最小的事務id
  4. creator_trx_id:生成該ReadView視圖的事務的id

MySQL5.7版本的源碼對于這些信息的定義如下:
MySQL多版本并發(fā)控制mvcc原理淺析,mysql,mysql,數(shù)據(jù)庫

插入一個注意事項:????????????????????????

start transaction不代表立即生成ReadView,而是在事務中第一次快照讀的時候生成ReadView,具體參考MySQL可重復讀隔離級別下開啟事務的一個注意事項

想要開啟事務時就生成ReadView,請使用

start transaction with consistent snapshot;
2.4讀視圖生成原則

ReadView定義了一個可見性算法,當事務進行快照讀時,依據(jù)該算法判斷事務能夠讀取哪個快照。

源碼的可見性判斷邏輯如下:(下載源碼可訪問:官網(wǎng),操作系統(tǒng)選擇Source Code)

/** Check whether the changes by id are visible.
	@param[in]	id	transaction id to check against the view
	@param[in]	name	table name
	@return whether the view sees the modifications of id. */
//判斷某個版本的數(shù)據(jù)是否對當前事務可見
bool changes_visible(
    trx_id_t		id,
    const table_name_t&	name) const
    MY_ATTRIBUTE((warn_unused_result)) {
    ut_ad(id > 0);
    //快照的id小于活躍事務id集合中的最小事務id 或者 快照的id等于創(chuàng)建這個視圖的事務id
    if (id < m_up_limit_id || id == m_creator_trx_id) {
        return(true);
    }
    //檢查快照id是否合法,如果快照的id大于等于下一要分配的事務id,則需要拋出警告信息(會出現(xiàn)這種情況嗎?)
    check_trx_id_sanity(id, name);
    //快照的id大于等于下一要分配的事務id
    if (id >= m_low_limit_id) {
        return(false);
    } 
    //當前不存在活躍的事務
    else if (m_ids.empty()) {
        return(true);
    }
    const ids_t::value_type*	p = m_ids.data();
    //通過二分查找判斷快照id是否在活躍事務集合中,存在則快照不可見,不存在則快照可見
    return(!std::binary_search(p, p + m_ids.size(), id));
}
  1. 快照id等于當前事務id時(trx_id=creator_trx_id),說明該版本是當前事務修改的,該快照對當前事務可見
  2. 快照id小于活躍事務的最小id(trx_id<up_limit_id),說明該版本對應的事務已經(jīng)提交了,該快照對當前事務可見
  3. 快照id大于等于下一個要分配的事務id(trx_id>=low_limit_id),則該快照對當前事務不可見
  4. 快照id小于下一個要分配的事務id并且活躍事務id數(shù)量為0(trx_id<low_limit_id && trx_ids.size==0),則該快照對當前事務可見
  5. 當以上條件都不滿足,則在活躍事務id集合里查找快照id,如果不存在,則可見,否則不可見
3.rc和rr隔離級別下mvcc的不同

mvcc主要用來解決rc(讀已提交)隔離級別下的臟讀和rr(可重復讀)隔離級別的不可重復讀問題,所以mvcc只在rc和rr隔離級別下生效。

區(qū)別在于,rc級別下,每一次快照讀都會生成一個最新的ReadView;RR級別下,只有事務中的第一次快照讀會生成ReadView,之后的快照讀會使用第一次生成的ReadView。

事務能否查詢到其他事物修改的數(shù)據(jù),取決于ReadView,而rc和rr兩個級別的ReadView生成方式不同,就導致了事務可見性不同。(rc級別下一個事務可以查詢到其他事物在此期間修改并提交的數(shù)據(jù),因為它的每次查詢都會生成新的ReadView;rr級別下事務無法查詢到其他事物在此期間修改并提交的數(shù)據(jù),因為他的ReadView只在第一次快照讀生成)文章來源地址http://www.zghlxwxcb.cn/news/detail-858030.html

到了這里,關于MySQL多版本并發(fā)控制mvcc原理淺析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【MySQL】事務之MVCC(多版本并發(fā)控制)

    【MySQL】事務之MVCC(多版本并發(fā)控制)

    讀-讀 :不存在任何問題,也不需要并發(fā)控制 讀-寫 :有線程安全問題,可能會造成事務隔離性問題,可能遇到臟讀,幻讀,不可重復讀 寫-寫 :有線程安全問題,可能會存在更新丟失問題,比如第一類更新丟失,第二類更新丟失 多版本并發(fā)控制 ( MVCC )是一種用來解決 讀

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

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

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

    2024年02月08日
    瀏覽(23)
  • MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Control)

    MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Control)

    MVCC 是一種用于數(shù)據(jù)庫管理系統(tǒng)的并發(fā)控制技術,允許多個事務同時訪問數(shù)據(jù)庫,而不會導致讀寫沖突。也就是說在讀寫的時候,線程不用去爭搶讀寫鎖。因為加鎖的過程比較耗性能。 當然很多時候還是必須的,不能避免,比如說,去ATM機取錢的時候,同時又在手機APP上進行

    2024年02月07日
    瀏覽(27)
  • Mysql--技術文檔--MVCC(Multi-Version Concurrency Control | 多版本并發(fā)控制)

    Mysql--技術文檔--MVCC(Multi-Version Concurrency Control | 多版本并發(fā)控制)

    ????????MVCC(Multi-Version Concurrency Control)是一種并發(fā)控制機制,用于解決并發(fā)訪問數(shù)據(jù)庫時的數(shù)據(jù)一致性和隔離性問題。MVCC允許多個事務同時讀取數(shù)據(jù)庫的同一數(shù)據(jù),而不會相互干擾或?qū)е聸_突。 ????????在傳統(tǒng)的并發(fā)控制機制中,如鎖定機制,事務會對讀取和寫入

    2024年02月11日
    瀏覽(20)
  • 深入解析MVCC:多版本并發(fā)控制的數(shù)據(jù)庫之道

    目錄 引言 一、什么是MVCC? 二、MVCC的實現(xiàn)原理 2.1版本號 2.1.1版本號的作用: 2.1.2版本號的組成: 2.1.3.示例 2.2事務id 2.2.1事務ID的作用: 2.2.2事務ID的生成: 2.2.3示例: 2.3 快照(Snapshot) 2.3.1快照的作用: 2.3.2快照的實現(xiàn)方式: 2.3.3示例: 2.4版本鏈(Version Chain) 2.4.1版本鏈

    2024年01月24日
    瀏覽(28)
  • MVCC------Mysql并發(fā)事務控制的工具

    MVCC------Mysql并發(fā)事務控制的工具

    MVCC 是 Multi-Version Concurrency Control(多版本并發(fā)控制)的縮寫,是數(shù)據(jù)庫系統(tǒng)中常用的一種并發(fā)控制方法。在MVCC 中,數(shù)據(jù)庫系統(tǒng)可以同時維護多個版本的數(shù)據(jù),每個事務在讀取數(shù)據(jù)時會看到一個一致性的快照,從而實現(xiàn)并發(fā)訪問而不會出現(xiàn)數(shù)據(jù)不一致的情況。這種機制能夠提

    2024年03月14日
    瀏覽(32)
  • 【Mysql】MVCC版本機制的多并發(fā)

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

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

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

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

    MVCC (Multiversion Concurrency Control),多版本并發(fā)控制。顧名思義,MVCC 是通過數(shù)據(jù)行的多個版本管理來實現(xiàn)數(shù)據(jù)庫的 并發(fā)控制 。這項技術使得在InnoDB的事務隔離級別下執(zhí)行一致性讀操作有了保證。換言之,就是為了查詢一些正在被另一個事務更新的行,并且可以看到它們被更

    2024年02月08日
    瀏覽(19)
  • MVCC并發(fā)版本控制之重點ReadView

    本文大部分來自 《MySQL是怎樣運行的》,這里只是簡單總結,用于各位回憶和復習。 對于使用 InnoDB 存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列(不知道的快去看《MySQL是怎樣運行的》) trx_id :每次一個事務對某條聚簇索引記錄進行改動時,都會把該事

    2024年02月09日
    瀏覽(20)
  • MVCC:多版本并發(fā)控制案例分析(二)

    (筆記總結自b站馬士兵教育課程) 本文主要分析readview的案例。 readview:表示事務進行快照讀操作的時候產(chǎn)生的讀視圖,在該事務進行快照讀的那一刻會生成一個系統(tǒng)當前的快照,但是此時的快照不是數(shù)據(jù)的快照,而是事務相關信息的快照。 trx_list readview生成時刻當前系統(tǒng)活

    2024年02月08日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包