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

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

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

1、概述

MVCC是一種用于數據庫管理系統(tǒng)的并發(fā)控制技術,允許多個事務同時訪問數據庫,而不會導致讀寫沖突。也就是說在讀寫的時候,線程不用去爭搶讀寫鎖。因為加鎖的過程比較耗性能。
當然很多時候還是必須的,不能避免,比如說,去ATM機取錢的時候,同時又在手機APP上進行提現,這種操作就需要加鎖,不能讓其同時提現,一次只能一個操作,而且只有在ATM取錢這個事務被提交之后才能做其他操作。

處理并發(fā)的場景無外乎三種:

讀、讀:這個不需要做控制,因為數據沒有變化
讀、寫:存在線程安全問題,可能出現臟讀、幻讀,不可重復讀
寫、寫:存在線程安全問題,可能出現更新丟失的情況

這里介紹的MVCC是在存儲引擎為InnoDB實現的,目的也是為了提高數據庫的并發(fā)性能,不使用加鎖的方式去處理讀、寫并發(fā)。

2、MVCC特點

這里的讀操作,有兩種方式:
快照讀:SELECT語句,在讀寫的時候不用加鎖,所以效率很高,但也存在讀取的時候有更新操作,可能會讀到歷史數據。

當前讀:讀取的是最新數據,是一種悲觀鎖的操作。它會對當前讀取的數據進行加鎖,避免其他事物對其進行寫操作。主要包括以下幾種操作:

select lock in share mode(共享鎖)
select for update(排他鎖)
update(排他鎖)
insert(排他鎖)
delete(排他鎖)

3、準備數據

在介紹之前,沒有安裝MYSQL的,可以先進行安裝,下載地址:https://dev.mysql.com/downloads/
安裝好了之后,我們就新建庫與表,插入一些數據來做個測試

CREATE DATABASE mydb;
USE mydb;

CREATE TABLE `tb1` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

INSERT INTO tb1(name) VALUES ('XIAO1'),('XIAO2'),('XIAO3');

CREATE TABLE `tb2` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=myisam;

INSERT INTO tb2(name) VALUES ('LAO1'),('LAO2'),('LAO3');

這里我特地創(chuàng)建了兩張表,分別是表tb1對應的是InnoDB引擎,表tb2對應的是myisam引擎,創(chuàng)建之后,也可以看到兩者的數據格式也是不一樣的,我們先查詢下,新建的數據庫mydb以及保存的數據在什么地方:

mysql> show variables like '%datadir%';
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| datadir       | C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)

然后可以看到,InnoDB引擎對應的是:tb1.ibd ,myisam對應的是:tb2.MYD(數據)、tb2.MYI(索引)、tb2_402.sdi(表結構)[這個在以前的版本沒有出現]
MySQL5.5之后都是默認為InnoDB引擎

4、MVCC原理

MYSQL存儲的數據中,除了我們顯式定義的字段,還隱含著兩個字段。
trx_id:事務id,每進行一次事務操作,就會自增1。
roll_pointer:回滾指針,用于找到上一個版本的數據,結合undolog進行回滾。

MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Control),其他(Others),mysql,MVCC,MYSQL多版本并發(fā)控制
我們用SELECT讀數據時,這一時刻的數據會有很多個版本【比如上圖四個版本】,但我們并不知道讀取哪個版本,依賴ReadView來對我們進行版本的選擇,通過ReadView我們就能夠知道讀取哪個版本。我們來看下這個ReadView的定義:

class ReadView {
/* ... */
private:
trx_id_t m_low_limit_id; /* 大于等于這個 ID 的事務均不可見 */

trx_id_t m_up_limit_id; /* 小于這個 ID 的事務均可見 */

trx_id_t m_creator_trx_id; /* 創(chuàng)建該 Read View 的事務ID */

trx_id_t m_low_limit_no; /* 事務 Number, 小于該 Number 的 Undo Logs 均可以被 Purge */

ids_t m_ids; /* 創(chuàng)建 Read View 時的活躍事務列表 */

m_closed; /* 標記 Read View 是否 close */
}

字段的解釋:

m_low_limit_id:目前出現的最大事務ID+1(下一個將被分配的事務ID)。大于等于這個ID的數據版本均不可見,也就訪問不到。

m_up_limit_id:活躍事務列表m_ids中最小的事務ID,如果為空,則m_up_limit_id為m_low_limit_id。小于這個ID的數據版本均可見。

m_ids:ReadView創(chuàng)建時其他未提交的活躍事務ID列表。創(chuàng)建ReadView時,將當前未提交事務ID記錄下來,后續(xù)即使它們修改了記錄行的值,對于當前事務也是不可見的。m_ids 不包括當前事務自己和已提交的事務(正在內存中)

m_creator_trx_id:創(chuàng)建該ReadView的事務ID

5、實踐操作

開四個終端,新建三個事務,兩個寫操作,一個讀操作,還有一個就是單純的查詢。大家可以根據不同的進入時間來了解這個過程,會產生未提交和已提交事務狀態(tài),對應的查詢信息都是不一樣的,具體代碼分別如下:

BEGIN;
UPDATE tb1 SET  name='XXX' WHERE id=1;
UPDATE tb1 SET  name='YYY' WHERE id=1;
COMMIT;

BEGIN;
UPDATE tb1 SET  name='ZZZ' WHERE id=1;
UPDATE tb1 SET  name='QQQ' WHERE id=1;
DELETE FROM tb1 WHERE id=5;
COMMIT;

BEGIN;
SELECT * FROM tb1 WHERE id=1;
COMMIT;

SELECT * FROM tb1;

6、小結

對于這種讀寫并發(fā),以及對性能的要求,大家需要看實際業(yè)務情況來做決定,其中這里主要是介紹InnoDB引擎,這個要高效很多,在以前的舊版本可能大家使用MyISAM這個更多,因為性能很好,不過不支持事務操作,所以很多場景也就不適應,MYSQL5.5版本之后就是默認InnoDB引擎了。
最后大家也可以嘗試在表tb2中去嘗試下,看下是什么結果,因為這張表使用的是MyISAM引擎,就起不到作用了。
另外需要注意的是,事務的提交是默認自動的,有些時候需要關閉,將默認的1修改為0:

SET AUTOCOMMIT=0;
SELECT @@AUTOCOMMIT;

比如說對于臟讀的情況,我們需要當前讀,也就是需要排它鎖:

SET AUTOCOMMIT=0;
BEIGIN;
DELETE FROM tb1 WHERE id=2;

這種情況如果我們的事務在這個時候進去,對這個id=2進行讀寫操作,就會出現臟讀的情況,這個時候就需要使用SELECT FOR UPDATE,等待事務處理完畢之后再做相應的操作。

對于臟讀這種情況,很常見,比如說事務在做刪除操作,這個時候記錄已被刪除但是還沒有提交事務,如果進行查詢操作就會出現臟讀,如下:

MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Control),其他(Others),mysql,MVCC,MYSQL多版本并發(fā)控制文章來源地址http://www.zghlxwxcb.cn/news/detail-727255.html

SET AUTOCOMMIT=0;
BEGIN;
SELECT * FROM tb1 WHERE id=2 FOR UPDATE;
UPDATE tb1 SET  name='QQQ' WHERE id=1;
COMMIT;

到了這里,關于MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Control)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

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

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

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

    2024年01月18日
    瀏覽(23)
  • 【MySQL】事務之MVCC(多版本并發(fā)控制)

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

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

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

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

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

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

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

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

    2024年02月08日
    瀏覽(23)
  • ⑩⑧【MySQL】InnoDB架構、事務原理、MVCC多版本并發(fā)控制

    ⑩⑧【MySQL】InnoDB架構、事務原理、MVCC多版本并發(fā)控制

    個人簡介:Java領域新星創(chuàng)作者;阿里云技術博主、星級博主、專家博主;正在Java學習的路上摸爬滾打,記錄學習的過程~ 個人主頁:.29.的博客 學習社區(qū):進去逛一逛~ InnoDB邏輯存儲結構 : ?? 表空間(idb文件) :一個MySQL實例可以對應多個表空間,用于存儲記錄、索引等數

    2024年02月04日
    瀏覽(52)
  • 一文了解MySQL中的多版本并發(fā)控制

    作者:京東零售??李澤陽 最近在閱讀《認知覺醒》這本書,里面有句話非常打動我: 通過自己的語言,用最簡單的話把一件事情講清楚,最好讓外行人也能聽懂。 也許這就是大道至簡,只是我們習慣了煩瑣和復雜。 希望借助今天這篇文章,能用大白話說清楚這個相對比較

    2023年04月11日
    瀏覽(25)
  • 多版本并發(fā)控制MVCC

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

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

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

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

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

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

    2024年02月08日
    瀏覽(22)
  • MVCC------Mysql并發(fā)事務控制的工具

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

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

    2024年03月14日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包