最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL之InnoDB中的MVCC用法

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

1、背景

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

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

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

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

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

通過sql語句修改是臨時生效的,有3種修改方式,一個是會話級設(shè)置,只影響當前連接,例如:

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

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

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

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

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

3、MVCC

【1】版本鏈

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

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)

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

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

此時版本鏈如下:

在這里插入圖片描述

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

【2】ReadView

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

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

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

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

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

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

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

【3】ReadView的生成時機

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

4、總結(jié)

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

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

相關(guān)文章

  • Mysql鎖內(nèi)部實現(xiàn)機制之C源碼解析

    Mysql鎖內(nèi)部實現(xiàn)機制之C源碼解析

    數(shù)據(jù)庫之所以要加鎖,因為數(shù)據(jù)庫是一個多用戶使用的共享資源。當多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性
    2022-08-08
  • MySQL游標詳細介紹

    MySQL游標詳細介紹

    大家好,本篇文章主要講的是MySQL游標詳細介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Linux下mysql 5.6.17安裝圖文教程詳細版

    Linux下mysql 5.6.17安裝圖文教程詳細版

    這篇文章主要為大家詳細介紹了Linux下mysql 5.6.17安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 數(shù)據(jù)庫MySQL/MariaDB安裝與基礎(chǔ)調(diào)優(yōu)過程

    數(shù)據(jù)庫MySQL/MariaDB安裝與基礎(chǔ)調(diào)優(yōu)過程

    文章主要描述了在Ubuntu上安裝MySQL后的安全配置步驟,并介紹了在日常開發(fā)中如何合理管理用戶和權(quán)限,文章還提到了創(chuàng)建數(shù)據(jù)庫、創(chuàng)建用戶和授予精確權(quán)限的操作方法,最后提到了核心調(diào)優(yōu)參數(shù)的并提供了相關(guān)建議,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • CentOS 安裝redis和MySQL

    CentOS 安裝redis和MySQL

    這篇文章主要介紹了CentOS 安裝redis和MySQL的相關(guān)資料,需要的朋友可以參考下
    2019-08-08
  • MySQL版本低了不支持兩個時間戳類型的值解決方法

    MySQL版本低了不支持兩個時間戳類型的值解決方法

    在本篇文章里小編給大家分享了關(guān)于MySQL 版本低了,不支持兩個時間戳類型的值的相關(guān)知識點,有興趣的朋友們可以參考下。
    2019-09-09
  • Mysql報錯Duplicate?entry?'值'?for?key?'字段名'的解決方法

    Mysql報錯Duplicate?entry?'值'?for?key?'字段名&

    今天在使用數(shù)據(jù)庫的過程中,發(fā)現(xiàn)一直報Duplicate?entry?'值'?for?key?'字段名'的錯誤,所以下面這篇文章主要給大家介紹了關(guān)于Mysql報錯Duplicate?entry?'值'?for?key?'字段名'的解決方法,需要的朋友可以參考下
    2023-04-04
  • centos7利用yum安裝mysql 8.0.12

    centos7利用yum安裝mysql 8.0.12

    這篇文章主要為大家詳細介紹了centos7利用yum安裝mysql 8.0.12,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 數(shù)據(jù)庫索引知識點整理

    數(shù)據(jù)庫索引知識點整理

    這篇文章主要介紹了數(shù)據(jù)庫索引知識點整理,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考
    2021-01-01
  • MySQL MyISAM 與InnoDB 的區(qū)別

    MySQL MyISAM 與InnoDB 的區(qū)別

    這篇文章主要介紹了MySQL MyISAM與InnoDB 的區(qū)別,幫助大家更好的理解和使用MySQL的存儲引擎,感興趣的朋友可以了解下
    2020-09-09

最新評論

博白县| 九龙城区| 峨山| 建昌县| 靖宇县| 泸溪县| 赤水市| 武穴市| 荆门市| 德格县| 肇庆市| 海南省| 井陉县| 丰原市| 洪雅县| 雷州市| 宁德市| 绥中县| 张家川| 加查县| 汕尾市| 新巴尔虎左旗| 台南县| 云浮市| 建阳市| 棋牌| 三台县| 泗阳县| 长武县| 满城县| 西林县| 体育| 洛扎县| 上蔡县| 张北县| 田阳县| 虎林市| 绵竹市| 禄劝| 隆回县| 安西县|