欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL之InnoDB中的MVCC用法

 更新時(shí)間:2025年06月26日 08:47:45   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之InnoDB中的MVCC用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、背景

MVCC叫做多版本并發(fā)控制,通過(guò)維護(hù)數(shù)據(jù)的多個(gè)歷史版本實(shí)現(xiàn)讀寫(xiě)分離:讀操作訪問(wèn)快照版本,無(wú)需加鎖,避免阻塞寫(xiě)操作;寫(xiě)操作創(chuàng)建新版本,不影響其它事務(wù)的讀操作。

這種機(jī)制支持了讀已提交可重復(fù)讀兩種事務(wù)隔離級(jí)別,InnoDB中是通過(guò)隱藏列事務(wù)id、版本鏈、Read View實(shí)現(xiàn)的MVCC。

2、設(shè)置事務(wù)的隔離級(jí)別

設(shè)置事務(wù)隔離級(jí)別可以通過(guò)修改配置文件和通過(guò)sql語(yǔ)句,修改的隔離級(jí)別有4種:讀未提交、讀已提交、可重復(fù)讀、串行化,修改配置文件可以永久生效,查看配置文件中的隔離級(jí)別如下:

[root@xxx xxx]# cat /xxx/my.cnf | grep 'transaction_isolation'
transaction_isolation                                      = READ-COMMITTED

通過(guò)sql語(yǔ)句修改是臨時(shí)生效的,有3種修改方式,一個(gè)是會(huì)話級(jí)設(shè)置,只影響當(dāng)前連接,例如:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

另一個(gè)是全局設(shè)置,影響所有連接,例如:

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)

最后一個(gè)是僅對(duì)下一個(gè)事務(wù)生效,例如:

mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

3、MVCC

【1】版本鏈

之前講過(guò)隱藏列:row_id、trx_id、roll_pointer,其中row_id不一定存在,當(dāng)沒(méi)有主鍵和唯一索引時(shí),row_id才存在,trx_id是事務(wù)id,roll_pointer指向undo日志,通過(guò)roll_pointer就可以組成一條版本鏈,接下來(lái)通過(guò)如下表和數(shù)據(jù)來(lái)說(shuō)明:

mysql> show create table student;
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
| Table   | Create Table
                                                                                                              |
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 | 張三 |
+----+------+
1 row in set (0.00 sec)

接下來(lái)分別在兩個(gè)事務(wù)中更新數(shù)據(jù),假設(shè)事務(wù)id分別為20和50:

時(shí)間順序事務(wù)A,事務(wù)id=20事務(wù)B,事務(wù)id=50
t1開(kāi)始事務(wù)開(kāi)始事務(wù)
t2UPDATE student SET name = ‘李四’ WHERE id = 1;
t3提交事務(wù)
t4UPDATE student SET name = ‘王五’ WHERE id = 1;
t5提交事務(wù)

此時(shí)版本鏈如下:

在這里插入圖片描述

name為王五的代表最新記錄,name為李四和張三的為undo日志。

【2】ReadView

  • 對(duì)于未提交讀的隔離級(jí)別事務(wù)來(lái)說(shuō),由于可以讀到未提交事務(wù)修改的記錄,直接讀取最新的版本就好了;
  • 對(duì)于串行化隔離級(jí)別的事務(wù)來(lái)說(shuō)是使用加鎖的方式來(lái)訪問(wèn)記錄的;
  • 對(duì)于讀已提交和可重復(fù)讀隔離級(jí)別的事務(wù)來(lái)說(shuō),只能讀到已提交事務(wù)的結(jié)果。所以核心問(wèn)題就是版本鏈中哪一個(gè)版本對(duì)當(dāng)前事務(wù)是可見(jiàn)的,所有就有了ReadView,ReadView中包含4個(gè)部分:
名稱(chēng)含義
m_ids生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫(xiě)事務(wù)id列表
min_trx_idm_ids中的最小值
max_trx_id分配給下一個(gè)事務(wù)的id值,不是m_ids中的最大值
creator_trx_id生成ReadView的事務(wù)id,只讀事務(wù)中為0

通過(guò)ReadView的屬性,我們就能判斷對(duì)記錄版本鏈中的哪一個(gè)版本可見(jiàn),判斷規(guī)則如下:

1、如果被訪問(wèn)版本的trx_id與ReadView的中的creator_trx_id相同,說(shuō)明當(dāng)前事務(wù)再訪問(wèn)自己修改的記錄,所以該版本可以被當(dāng)前事務(wù)訪問(wèn)。

2、如果被訪問(wèn)版本的trx_id小于ReadView的中的min_trx_id值,說(shuō)明生成該版本的事務(wù)在當(dāng)前事務(wù)之前已經(jīng)提交,所以該版本可以被當(dāng)前事務(wù)訪問(wèn)。

3、如果被訪問(wèn)版本的trx_id大于ReadView的中的max_trx_id值,表明生成該版本的事務(wù)在當(dāng)前事務(wù)之后開(kāi)啟,所以該版本不可以被當(dāng)前事務(wù)訪問(wèn)。

4、如果被訪問(wèn)的版本的trx_id在ReadView的min_trx_id和max_trx_id之間,需要判斷trx_id是否在m_ids中,在就說(shuō)明該版本的事務(wù)還是活躍的,不可以被訪問(wèn);不在就說(shuō)明該版本已經(jīng)提交,可以被訪問(wèn)。

如果某個(gè)版本的數(shù)據(jù)對(duì)當(dāng)前事務(wù)不可見(jiàn),就順著版本鏈去判斷下一個(gè)版本的數(shù)據(jù),一直到最后一個(gè)版本,如果最后一個(gè)版本也不可見(jiàn),那查詢結(jié)果就不包含這條記錄。

【3】ReadView的生成時(shí)機(jī)

隔離級(jí)別生成ReadView時(shí)機(jī)
讀已經(jīng)提交每次讀取數(shù)據(jù)前都生成一個(gè)ReadView
可重復(fù)讀第一次讀取數(shù)據(jù)時(shí)生成一個(gè)ReadView

4、總結(jié)

MVCC是一種數(shù)據(jù)庫(kù)并發(fā)控制技術(shù),通過(guò)維護(hù)數(shù)據(jù)的多個(gè)歷史版本實(shí)現(xiàn)讀寫(xiě)操作的并行化,從而提升性能并解決事務(wù)隔離性問(wèn)題。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySql的存儲(chǔ)過(guò)程學(xué)習(xí)小結(jié) 附pdf文檔下載

    MySql的存儲(chǔ)過(guò)程學(xué)習(xí)小結(jié) 附pdf文檔下載

    這篇文章主要是介紹mysql存儲(chǔ)過(guò)程的創(chuàng)建,刪除,調(diào)用及其他常用命令
    2012-03-03
  • Mysql通過(guò)explain分析定位數(shù)據(jù)庫(kù)性能問(wèn)題

    Mysql通過(guò)explain分析定位數(shù)據(jù)庫(kù)性能問(wèn)題

    這篇文章主要介紹了Mysql通過(guò)explain分析定位數(shù)據(jù)庫(kù)性能問(wèn)題,明確SQL在Mysql中實(shí)際的執(zhí)行過(guò)程是怎樣的,如果查詢字段沒(méi)有索引則增加索引,如果有索引就要分析為什么沒(méi)有用到索引,本文詳細(xì)講解,需要的朋友可以參考下
    2023-01-01
  • MySQL如何為字段添加默認(rèn)時(shí)間淺析

    MySQL如何為字段添加默認(rèn)時(shí)間淺析

    這篇文章主要給大家介紹了關(guān)于MySQL如何為字段添加默認(rèn)時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • mysql判斷字段是否存在的方法

    mysql判斷字段是否存在的方法

    mysql判斷字段是否存在的方法有很多,如使用desc命令、show columns 命令、describe 命令等等,感興趣的朋友可以參考下
    2014-01-01
  • 用SELECT... INTO OUTFILE語(yǔ)句導(dǎo)出MySQL數(shù)據(jù)的教程

    用SELECT... INTO OUTFILE語(yǔ)句導(dǎo)出MySQL數(shù)據(jù)的教程

    這篇文章主要介紹了用SELECT... INTO OUTFILE語(yǔ)句導(dǎo)出MySQL數(shù)據(jù)的教程,是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • 詳解MySql Date函數(shù)

    詳解MySql Date函數(shù)

    這篇文章主要介紹了MySql Date函數(shù)的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • MySQL圖形化管理工具Navicat安裝步驟

    MySQL圖形化管理工具Navicat安裝步驟

    大家好,本篇文章主要講的是MySQL圖形化管理工具Navicat安裝步驟,感興趣的同學(xué)趕快來(lái)看看吧,對(duì)你有幫助的話記得收藏一下哦
    2021-12-12
  • MySQL架構(gòu)體系知識(shí)點(diǎn)總結(jié)

    MySQL架構(gòu)體系知識(shí)點(diǎn)總結(jié)

    在本篇內(nèi)容里我們給大家整理了關(guān)于MySQL架構(gòu)體系的相關(guān)知識(shí)點(diǎn)內(nèi)容以及相關(guān)實(shí)例,需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作

    MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作

    這篇文章主要介紹了MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • MySQL示例DTID主從原理解析

    MySQL示例DTID主從原理解析

    這篇文章主要介紹了MySQL示例DTID主從原理解析,其實(shí)包含了詳細(xì)的使用方法說(shuō)明,有需要的朋友可以借鑒參考下,希望可以有所幫助,感謝閱讀
    2021-09-09

最新評(píng)論