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

《MySQL MVCC 》

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

什么是 MySQL InnoDB 的 MVCC?

MVCC (Multi-Version Concurrency Control)是一種基于多版本的并發(fā)控制協(xié)議,只有在 InnoDB 引擎下存在。MVCC 是為了實現(xiàn)事務(wù)的隔離性,即通過版本號,避免同一數(shù)據(jù)在不同事務(wù)間的競爭,可以把它當(dāng)成基于多版本號的一種樂觀鎖。當(dāng)然,這種樂觀鎖只在事務(wù)級別讀已提交(RC)和可重復(fù)讀(RR)有效。MVCC 最大的好處,讀不加鎖,讀寫不沖突。在讀多寫少的應(yīng)用中,讀寫不沖突是非常重要的,極大的增加了系統(tǒng)的并發(fā)性能。

前置了解知識:

MySQL 的核心日志有哪些?

MySQL 中有七種日志文件,分別是:redo log(重做日志)、undo log(回滾日志)、bin log(二進制日志)、error log(錯誤日志)、slow query log(慢查詢?nèi)罩荆?、general log(一般查詢?nèi)罩荆瑀elay log(中繼日志)

bin log: 就是 binary log,二進制日志文件,記錄了 MySQL 所有的 DDL 和 DML (除了數(shù)據(jù)查詢語句)操作,以事件形式記錄,還包含語句所執(zhí)行的消耗的時間,MySQL 的二進制日志是事務(wù)安全型的。通過 bin log 日志我們可以做數(shù)據(jù)恢復(fù),增量備份,主主復(fù)制和主從復(fù)制等等

undo log: 是 MySQL 用來記錄事務(wù)操作的 反方向邏輯日志,顧名思義,undo log是一種用于撤銷回退的日志,在事務(wù)沒提交之前,MySQL 會先記錄更新前的數(shù)據(jù)到 undo log 日志文件里面,當(dāng)事務(wù)回滾時或者數(shù)據(jù)庫崩潰時,可以利用 undo log 來進行回退

redo log: 是 InnoDB 存儲引擎產(chǎn)生的,記錄事務(wù)對數(shù)據(jù)頁的修改,如果 mysql 掛了,重啟后 InnoDB 會使用redo log 恢復(fù)數(shù)據(jù),保證了數(shù)據(jù)的持久性

數(shù)據(jù)庫的事務(wù)特性 (ACID)有哪些?

  • 原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么全部不執(zhí)行

  • 持久性(Durability): 對于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對數(shù)據(jù)庫的改變不被丟失,即使數(shù)據(jù)庫出現(xiàn)故障

  • 隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對其他事務(wù)必須是透明的

  • 一致性(Consistency):幾個并行執(zhí)行的事務(wù),其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

MySQL 數(shù)據(jù)庫的隔離級別有哪些,都會產(chǎn)生什么樣的問題?

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

臟讀

臟讀指的是讀到了其他事務(wù)未提交的數(shù)據(jù),未提交意味著這些數(shù)據(jù)可能會回滾,也就是可能最終不會存到數(shù)據(jù)庫中,也就是不存在的數(shù)據(jù)。讀到了并一定最終存在的數(shù)據(jù)

不可重復(fù)讀

不可重復(fù)讀指的是在一個事務(wù)內(nèi),最開始讀到的數(shù)據(jù)和事務(wù)結(jié)束前的任意時刻讀到的同一批數(shù)據(jù)出現(xiàn)不一致的情況。

幻讀

同樣一筆查詢在整個事務(wù)過程中多次執(zhí)行后,查詢所得的結(jié)果集是不一樣的。也是指當(dāng)事務(wù)不獨立執(zhí)行時,插入或者刪除另一個事務(wù)當(dāng)前影響的數(shù)據(jù)而發(fā)生的一種類似幻覺的現(xiàn)象。

什么是 MySQL InnoDB 當(dāng)前讀、快照讀?

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

它讀取的數(shù)據(jù)庫記錄,都是當(dāng)前最新的版本,會對當(dāng)前讀取的數(shù)據(jù)進行加鎖,防止其他事務(wù)修改數(shù)據(jù)。是悲觀鎖的一種操作。

如下操作都是當(dāng)前讀:

  • select lock in share mode(共享鎖)

  • select for update(排他鎖)

  • update(排他鎖)

  • insert(排他鎖)

  • delete(排他鎖)

  • 串行化事務(wù)隔離級別

什么是快照讀?

快照讀的實現(xiàn)是基于多版本并發(fā)控制,即 MVCC,既然是多版本,那么快照讀到的數(shù)據(jù)不一定是當(dāng)前最新的數(shù)據(jù),有可能是之前歷史版本的數(shù)據(jù)。普通的 select 查詢語句(即不加鎖的 select 操作)就是快照讀

重要:后續(xù)圖解會進行演示

Read Committed 隔離級別:每次 select 都生成一個快照讀。

Read Repeatable 隔離級別:開啟事務(wù)后第一個 select 語句才是快照讀的地方,而不是一開啟事務(wù)就快照讀。即僅在第一次執(zhí)行快照讀時生成

為什么需要 MVCC?

  • 讀寫鎖的出現(xiàn)

讀鎖和讀鎖之間不互斥,而寫鎖和寫鎖、讀鎖都互斥。這樣就很大提升了系統(tǒng)的并發(fā)能力。之后人們發(fā)現(xiàn)并發(fā)讀還是不夠

  • MVCC 概念出現(xiàn)

能不能讓讀寫之間也不沖突的方法,就是讀取數(shù)據(jù)時通過一種類似快照的方式將數(shù)據(jù)保存下來,這樣讀鎖就和寫鎖不沖突了,不同的事務(wù) session 會看到自己特定版本的數(shù)據(jù)。當(dāng)然快照是一種概念模型,不同的數(shù)據(jù)庫可能用不同的方式來實現(xiàn)這種功能

總結(jié)MVCC 最大的優(yōu)點是讀不加鎖,因此讀寫不沖突,并發(fā)性能好,類比 Java 中的讀寫鎖,它是會存在讀寫競爭的,會有這個性能問題。MVCC 在 MySQL InnoDB 中的實現(xiàn)主要是為了提高數(shù)據(jù)庫并發(fā)性能,用更好的方式去處理讀-寫沖突,做到即使有讀寫沖突時,也能做到不加鎖,非阻塞并發(fā)讀

MVCC 實現(xiàn)的原理

MySQL MVCC 實現(xiàn)原理:

具體實現(xiàn)主要是由 隱式字段 + undolog 版本鏈 + read view 的方式實現(xiàn)

隱式字段:

  • DB_TRX_ID:最近修改(修改/插入)事務(wù)ID:記錄創(chuàng)建這條記錄/最后一次修改該記錄的事務(wù) ID,這個 id 是遞增的

  • DB_ROLL_PTR:回滾指針,指向這條記錄的上一個版本

圖解:

id

name

DB_TRX_ID

DB_ROLL_PTR

1088

張三

1

0x1232123

undolog 版本鏈?zhǔn)鞘裁矗?/h4>

在每次更新該記錄后,都會將舊值放到一條 undo 日志中。隨著更新次數(shù)的增多,所有的版本都會被 roll_pointer 屬性連接成一條鏈表,這個鏈表就稱之為版本鏈。

圖解:

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

Read View 是什么?

原文:

read view

An internal snapshot used by the MVCC mechanism of InnoDB. Certain transactions, depending on their isolation level, see the data values as they were at the time the transaction (or in some cases, the statement) started. Isolation levels that use a read view are REPEATABLE READ, READ COMMITTED, and READ UNCOMMITTED.

Read View是一個數(shù)據(jù)庫的內(nèi)部快照,該快照被用于 InnoDB 存儲引擎中的 MVCC 機制。簡單點說,Read View 就是一個快照,保存著數(shù)據(jù)庫某個時刻的數(shù)據(jù)信息。Read View 會根據(jù)事務(wù)的隔離級別決定在某個事務(wù)開始時,該事務(wù)能看到什么信息。就是說通過 Read View,事務(wù)可以知道此時此刻能看到哪個版本的數(shù)據(jù)記錄(有可能不是最新版本的,也有可能是最新版本的)??芍貜?fù)讀、讀已提交、讀未提交,這幾個隔離級別都會使用 Read View

通俗點我的理解,Readview 是一個數(shù)據(jù)結(jié)構(gòu),包含四個字段,Read View 是"快照讀" SQL 執(zhí)行時 MVCC 提取數(shù)據(jù)的依據(jù)和規(guī)則

ReadView 包含的內(nèi)容:
  • m_ids:當(dāng)前活躍的事務(wù)編號集合,即還未提交。

  • min_trx_id:最小活躍事務(wù)編號

  • max_trx_id:預(yù)分配事務(wù)編號,當(dāng)前最大事務(wù)編號 +1

  • creator_trx_id: ReadView 創(chuàng)建者的事務(wù)編號

ReadView 提取數(shù)據(jù)得規(guī)則:

1、被訪問的 trx_id 與 readview 中的 creator_trx_id 相同,表示當(dāng)前事務(wù)在訪問自己修改的記錄,可見,返回;

2、被訪問的 trx_id 小于 min_trx_id,表明該版本已提交,可見,返回;

3、被訪問的 trx_id 大于等于 max_trx_id ,表明該版本在生成 readview 時,還未開啟,不可見,返回;

4、被訪問的 trx_id 在 min_trx_id 和 max_trx_id 之間,判斷是否在 m_ids 中,如果在,則說明生成 readview時,該版本事務(wù)未提交,該版本不可見;如果不在,則說明生成 readview 時,該版本事務(wù)已提交可見,返回。

案例圖解說明:

思考:RC、RR 兩種隔離級別下,兩次查詢的結(jié)果是什么?

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

答案:

RR 級別: select1="張三" select2="張三"

RC 級別: select1="張三" select2="張小三" RC 隔離級別下出現(xiàn)了"不可重復(fù)讀",后續(xù)講解為什么

上述問題的產(chǎn)生以及 ReadView 解析:

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

RC 級別下得 read view 圖解分析

1. 這是第兩次我們進行 select 語句 read view 給我們生成的:

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

?2. 第一次 select 語句分析圖解:

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

?

3. 第二次 select 語句分析圖解:

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

?

4. 產(chǎn)生的問題:

在 RC 隔離級別下,兩次 select 語句讀取到的內(nèi)容不一致問題,即證明了 MySQL 數(shù)據(jù)庫的隔離級為 RC 級別下會產(chǎn)生不可重復(fù)讀問題,再次證實前置了解知識模塊中的不同隔離級別產(chǎn)生的問題所述。原因是 READ COMMITTD 在每一次進行普通 SELECT 操作前都會生成一個 ReadView

RR 級別下得 read view 圖解分析

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

?

1. 連續(xù)多次快照讀,ReadView 會產(chǎn)生復(fù)用,沒有幻讀問題
2. RR 級別下使用 MVCC 能避免幻讀嗎?

答案能,但不完全能!

特例:當(dāng)兩次快照讀之間存在當(dāng)前讀,ReadView會重新生成,導(dǎo)致產(chǎn)生幻讀

《MySQL MVCC 》,mysql,數(shù)據(jù)庫,MVCC,面試

MVCC 總結(jié):

所謂的MVCC(Multi-Version Concurrency Control ,多版本并發(fā)控制)指的就是在使用讀已提交(READ COMMITTD)、可重復(fù)讀(REPEATABLE READ)這兩種隔離級別的事務(wù)在執(zhí)行普通的 SELECT 操作時訪問記錄的版本鏈的過程,這樣子可以使不同事務(wù)的讀-寫、寫-讀操作并發(fā)執(zhí)行,從而提升系統(tǒng)性能。

這兩個隔離級別的一個很大不同就是:生成ReadView的時機不同,READ COMMITTD 在每一次進行普通 SELECT操作前都會生成一個 ReadView,而 REPEATABLE READ 只在第一次進行普通 SELECT 操作前生成一個ReadView,數(shù)據(jù)的可重復(fù)讀其實就是 ReadView 的重復(fù)使用。

擴展知識:

1. "當(dāng)前讀" 的實現(xiàn)是基于 next-key lock (行記錄鎖+Gap間隙鎖)文章來源地址http://www.zghlxwxcb.cn/news/detail-835249.html

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

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

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

相關(guān)文章

  • mysql數(shù)據(jù)庫面試題基礎(chǔ)知識,Hadoop之MapReduce04,騰訊java面試流程

    mysql數(shù)據(jù)庫面試題基礎(chǔ)知識,Hadoop之MapReduce04,騰訊java面試流程

    該方法的執(zhí)行過程比較復(fù)雜,我們慢慢來分析,首先來看下簡化的時序圖 3.1waitForCompletion public boolean waitForCompletion(boolean verbose ) throws IOException, InterruptedException, ClassNotFoundException { // 判斷任務(wù)的狀態(tài),如果是DEFINE就提交 if (state == JobState.DEFINE) { submit(); } if (verbose) { // 監(jiān)聽并且

    2024年04月14日
    瀏覽(33)
  • java八股文面試[數(shù)據(jù)庫]——MySQL死鎖的原因和處理方法

    java八股文面試[數(shù)據(jù)庫]——MySQL死鎖的原因和處理方法

    1) 表的死鎖 產(chǎn)生原因 : 用戶A訪問表A(鎖住了表A),然后 又訪問表B ;另一個用戶B訪問表B(鎖住了表B),然后企圖 訪問表A ;這時用戶A由于用戶B已經(jīng)鎖住表B,它必須等待用戶B釋放表B才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù),這就死鎖就產(chǎn)生了。 用戶A--》A表(表

    2024年02月09日
    瀏覽(28)
  • 從小白到數(shù)據(jù)庫達(dá)人!Mysql優(yōu)化讓你的社招面試無往不利!

    從小白到數(shù)據(jù)庫達(dá)人!Mysql優(yōu)化讓你的社招面試無往不利!

    大家好,我是小米,在這個美好的時刻又迎來了我們的技術(shù)小窩。今天,我們要聊一聊一個在數(shù)據(jù)庫領(lǐng)域中無比重要的話題 —— Mysql 優(yōu)化 !是不是感覺很興奮呢?廢話不多說,讓我們直接進入今天的主題。 首先,我們要了解一下 Mysql 到底是什么。 Mysql 是一個開源的關(guān)系型

    2024年02月14日
    瀏覽(19)
  • mysql面試題30:什么是數(shù)據(jù)庫連接池、應(yīng)用程序和數(shù)據(jù)庫建立連接的過程、為什么需要數(shù)據(jù)庫連接池、你知道哪些數(shù)據(jù)庫連接池

    mysql面試題30:什么是數(shù)據(jù)庫連接池、應(yīng)用程序和數(shù)據(jù)庫建立連接的過程、為什么需要數(shù)據(jù)庫連接池、你知道哪些數(shù)據(jù)庫連接池

    該文章專注于面試,面試只要回答關(guān)鍵點即可,不需要對框架有非常深入的回答,如果你想應(yīng)付面試,是足夠了,抓住關(guān)鍵點 數(shù)據(jù)庫連接池是一種用于管理和復(fù)用數(shù)據(jù)庫連接的技術(shù)。它是在應(yīng)用程序和數(shù)據(jù)庫之間建立一組數(shù)據(jù)庫連接,并以池的形式存儲起來,每當(dāng)應(yīng)用程序需

    2024年02月07日
    瀏覽(31)
  • 面試之MySQL中的mvcc

    面試之MySQL中的mvcc

    ?首先需要知道什么是 MVCC? MVCC 多版本并發(fā)控制。MVCC就是通過數(shù)據(jù)行的多個版本管理來實現(xiàn)數(shù)據(jù)庫的并發(fā)控制。這項技術(shù)是的InnoDB的事務(wù)隔離級別下執(zhí)行一致性讀 有了保證。換言之,就是為了查詢一些正在被一個事務(wù)更新的行。并且可以看到他們被更新之前的值。查詢在做查

    2024年02月16日
    瀏覽(19)
  • MVCC-數(shù)據(jù)庫

    MVCC-數(shù)據(jù)庫

    事務(wù),由一個有限的數(shù)據(jù)庫操作序列構(gòu)成,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位。 假如A轉(zhuǎn)賬給B 100 元,先從A的賬戶里扣除 100 元,再在 B 的賬戶上加上 100 元。如果扣完A的100元后,還沒來得及給B加上,銀行系統(tǒng)異常了,最后導(dǎo)致A的余額減少

    2024年02月06日
    瀏覽(24)
  • 【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫, MySQL 刪除數(shù)據(jù)庫,MySQL 選擇數(shù)據(jù)庫

    【MySQL 】MySQL 創(chuàng)建數(shù)據(jù)庫, MySQL 刪除數(shù)據(jù)庫,MySQL 選擇數(shù)據(jù)庫

    作者簡介: 辭七七,目前大一,正在學(xué)習(xí)C/C++,Java,Python等 作者主頁: 七七的個人主頁 文章收錄專欄: 七七的閑談 歡迎大家點贊 ?? 收藏 ? 加關(guān)注哦!???? 我們可以在登陸 MySQL 服務(wù)后,使用 create 命令創(chuàng)建數(shù)據(jù)庫,語法如下: 以下命令簡單的演示了創(chuàng)建數(shù)據(jù)庫的過程,

    2024年02月13日
    瀏覽(115)
  • 【MySQL數(shù)據(jù)庫】初識MySQL數(shù)據(jù)庫、安裝MySQL

    【MySQL數(shù)據(jù)庫】初識MySQL數(shù)據(jù)庫、安裝MySQL

    在今天的數(shù)字化世界中,數(shù)據(jù)是企業(yè)和個人的重要資產(chǎn)。管理和存儲數(shù)據(jù)變得至關(guān)重要,而 MySQL 數(shù)據(jù)庫是一種備受歡迎的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它提供了穩(wěn)定、可靠、高性能的數(shù)據(jù)存儲解決方案。本文將介紹 MySQL 數(shù)據(jù)庫的基本概念和安裝過程,以便初學(xué)者能夠輕松上

    2024年02月08日
    瀏覽(23)
  • 初識MySQL數(shù)據(jù)庫——“MySQL數(shù)據(jù)庫”

    初識MySQL數(shù)據(jù)庫——“MySQL數(shù)據(jù)庫”

    各位CSDN的uu們你們好呀,小雅蘭好久沒有更文啦,確實是心有余而力不足,最近學(xué)習(xí)的內(nèi)容太難了,這篇博客又是小雅蘭的新專欄啦,主要介紹的是一些MySQL數(shù)據(jù)庫的知識點,下面,讓我們進入初識MySQL數(shù)據(jù)庫的世界吧 為什么要使用數(shù)據(jù)庫 數(shù)據(jù)庫與數(shù)據(jù)庫管理系統(tǒng) MySQL介紹

    2024年02月06日
    瀏覽(18)
  • 【MySQL數(shù)據(jù)庫】MySQL數(shù)據(jù)庫管理

    【MySQL數(shù)據(jù)庫】MySQL數(shù)據(jù)庫管理

    Structure Query Language(結(jié)構(gòu)化查詢語言)簡稱SQL,它被美國國家標(biāo)準(zhǔn)局(ANSI)確定為關(guān)系型數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn),后被國際化標(biāo)準(zhǔn)組織(ISO)采納為關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)。數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫;定義和操作數(shù)據(jù),維護數(shù)據(jù)的完整性和安全性。 數(shù)據(jù):(data)

    2024年02月08日
    瀏覽(49)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包