iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySql--MVCC
  • 248
分享到

MySql--MVCC

摘要

一、MVCC是什么?   Multi-Vesrion Concurrency Control多版本并发控制,mvcC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 你可以把MVCC看作一种行级别锁的妥协,在很多情况下


	MySql--MVCC
[数据库教程]

一、MVCC是什么?

 

Multi-Vesrion Concurrency Control多版本并发控制,mvcC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。

你可以把MVCC看作一种行级别锁的妥协,在很多情况下避免了的使用,同时可以提供更小的开销。根据不同的实现,可以允许非阻塞式读,在写操作时只锁定必要的记录

 MVCC只在REPEATABLE READREAD COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行,而SERIALIZABLE会对所有读取到的行都加锁。

 

优势:

使用MVCC多版本并发控制比锁定模型的主要优点是在MVCC里,对检索(读)数据的锁要求与写数据的锁要求不冲突,所以读不会阻塞写写也不会阻塞读

恰当的使用MVCC会提供比锁更好的性能。

 

二、MVCC的底层原理

 

InnDB内部结构

 为了实现MVCC机制,InnDB内部为每一行添加了两个隐藏列:DB_TRX_IDDB_ROLL_PTRMysql另外还有一个隐藏DB_ROW_ID,这是在InnoDB表没有主键的时候会用来作为主键)。

 DB_TRX_ID:长度为6字节,存储了插入或更新语句的最后一个事务的事务ID。

 DB_ROLL_PTR:长度为7字节,称之为:回滚指针。回滚指针指向写入回滚段的undo log记录,读取记录的时候会根据指针去读取undo log中的记录。(正因为mysql中undo log中会维护一个历史数据记录,所以我们应该养成定期提交事务的习惯,否则回滚段会越来越   大,甚至占满了表空间。)

 read-view: 当执行查询sql时会生成一致性试图read-view,它由执行查询时所有未提交事务id数组([DB_TRX_ID,DB_TRX_ID]已创建的最大事务id组成(数组里最小id:min_id,最大id:max_id),查询的数据结果需要跟read-view做比对从而得到快照结果。

 

快照读

 快照读是针对上下文的当前读而言,指的是在RR隔离级别下,在不加锁的情况下MySql会根据回滚指针选择从undo log记录中获取快照数据,而不总是获取新的数据,这也就是为什么另一个事务提交了数据,在当前事务中看到的依然是另一个事务提交之前的数据。

 

版本链比较规则(重点):

如果落在绿色部分(trx_id

如果落在红色部分(trx_id>max_id),表示这个版本是由将来启动的事务生成的,是肯定不可见的。

如果落在黄色部分(min_id<=trx_id<=max_id),那就包括两种情况

   a.若row在trx_id在数组中,表示这个版本是由还没提交的事务生成的,不可见,当前自己的事务是可见的

   b.若row的trx_id不在数组中,表示这个版本是已经提交的事务生成的,可见。

技术图片

 

下面逐步分析一下(RR隔离级别下

 

第一步:

有表:table1、table2。table2表中有字段:id、name、db_trx_id、db_roll_ptr(重点看table2)

事务100对table1进行了update(未提交)、事务200对table1进行了update(未提交)、事务300对table2进行了update操作(已提交)

技术图片

 

 

 

update前:版本链中有一条id=1、name=UZI、db_trx_id=60的数据

update中:先将版本链上最新的数据复制一份,然后将trx_id修改成update的trx_id,将db_roll_ptr指向原始数据。

update后:版本链中有两条数据,新数据用指针指向旧数据

技术图片

 

 

 注意:这时readview为[100,200],300,因为事务100未提交、事务200未提交,当前最大db_trx_id=300。

 当在select1中进行select时,trx_id在readview([100,200],300)的黄色区域,且不再数组中,所以name的结果为JackLove。(符合比较规则)

 

第二步:

技术图片

 

 

 事务100又对table2先后进行了两次update操作,在commit前,select1进行了一次select。

 这时版本链内的数据如下:

技术图片

 注意:这时readview也是[100,200],300,因为在一个事务中readview是不可变的,从第一次执行sql开始。

 当在select1中进行select时(trx_id=100),先判断第一条数据,发现在黄色区域且在数组内,则不符合。

 向下找第二条数据,发现也在黄色区域且在数组内,则不符合。

  向下找第三条数据,发现也在黄色区域且不在数组内,符合,所以还是返回name="JackLove"。

 

第三步:

技术图片

 

 事务200分别进行了两次update,在commit前,select1和select2分别进行了一次select;

 这时版本链中的数据如下:

 技术图片

 

 

 

 这时select1(readview:[100,200],300)查询结果是:name="JackLove",

 select2进行select时,事务200未提交,最大max_id=300,所以readview=[200],300,trx_id=200,

 进行逐次比较,结果name="Rookie"

 

对于删除操作:

 对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的trx_id,同时在该条记录的头信息(record header)里的(deleted flag)标记未写上true,来表示当前记录已经被删除,在查询时按照上面的规则查到对应的   记录,如果delete_flag标记为true,意味着记录已被删除,则不返回数据。

 

总结:

MVCC解决了什么问题?

  就是解决了Repeatable Read和Read Committed两个隔离级别下读同一行和写同一行的两个事务的并发。

 

MySql--MVCC

原文地址:https://www.cnblogs.com/BounceGuo/p/13441073.html

您可能感兴趣的文档:

--结束END--

本文标题: MySql--MVCC

本文链接: https://www.lsjlt.com/news/7717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySql--MVCC
    一、MVCC是什么?   Multi-Vesrion Concurrency Control多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。 你可以把MVCC看作一种行级别锁的妥协,在很多情况下...
    99+
    2018-07-06
    MySql--MVCC 数据库入门 数据库基础教程 数据库 mysql
  • 浅析MySQL - MVCC
    版本链 在InnoDB引擎表中,他们的聚簇索引记录中有两个隐藏列: trx_id:用来存储对数据进行修改时的事务id roll_pointer:每次对哪条聚簇索引记录有修改的时候,就会把老版本写入undo日...
    99+
    2022-05-15
    MySQL mvcc
  • MySQL优化--MVCC
    MySQL优化--概述以及索引优化分析 MySQL优化--查询分析工具以及各种锁 七、MVCC 7.1、必备知识 7.1.1、什么是MVCC 多版本并发控制(Multiversion concurrency control, MCC 或 ...
    99+
    2022-03-08
    MySQL优化--MVCC 数据库入门 数据库基础教程
  • 【MySQL】MVCC详解与MVCC实现原理(MySQL专栏启动)
    📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性...
    99+
    2023-09-06
    mysql java 数据库 MVCC 事务
  • mysql mvcc 原理详解
    前言 很多人在谈起mysql事务的时候都能很快的答出mysql的几种事务隔离级别,以及在各自隔离级别下产生的问题,但是一旦谈到为什么会产生这样的结果时会觉得难以回答,说到底,还是对底层的原理未做深入的探究,本篇将从较为底层的原理层面来聊聊...
    99+
    2023-09-17
    mvcc mysql mvcc原理 mvcc 原理详解 mysql mvcc说明 mysql mvcc详解
  • MySQL中的事务和MVCC
    本篇博客参考掘金小册——MySQL 是怎样运行的:从根儿上理解 MySQL 以及极客时间——MySQL实战45讲。 虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引、事务、锁,我们还是必须要有一个较为浅显的认识,...
    99+
    2014-11-23
    MySQL中的事务和MVCC
  • mysql中的mvcc 原理详解
    目录简介前言一、mysql 数据写入磁盘流程二、redo log1、redolog 的整体流程 2、为什么需要 redo log三、undo log1、undo&...
    99+
    2022-11-13
    mysql mvcc 原理 mysql mvcc 
  • Mysql MVCC机制原理详解
    什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事...
    99+
    2022-05-25
    Mysql MVCC MVCC机制原理
  • MySQL锁、事务、MVCC是什么
    这篇文章将为大家详细讲解有关MySQL锁、事务、MVCC是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。单条SQL语句执行时,会被当成一个事务提交吗?以下内容摘自 《...
    99+
    2022-10-18
  • MySQL中MVCC有哪些用法
    本文主要给大家简单讲讲MySQL中MVCC有哪些用法,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL中MVCC有哪些用法这篇文章可以给大家带来一些实...
    99+
    2022-10-18
  • MySQL MVCC的知识点总结
    本篇内容介绍了“MySQL MVCC的知识点总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1).Mul...
    99+
    2022-10-18
  • 怎么理解MySQL中的MVCC
    这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。关系数据库管理系统使用MVCC(Multiversi...
    99+
    2022-10-19
  • MySQL MVCC的详解之Read View
    文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制2.2、源码 三、参考 概要 在上文中,我们提到了...
    99+
    2023-08-30
    MVCC READ VIEW MySQL
  • PostgreSQL的MVCC vs InnoDB的MVCC
    任何一个数据库最主要功能之一是可扩展。如果不删除彼此,则尽可能较少锁竞争从而达到这个目的。由于read、write、update、delete是数据库中最主要且频繁进行的操作,所以并发执行这些操作时不被阻塞...
    99+
    2022-10-18
  • MySQL InnoDB之MVCC原理是什么
    今天小编给大家分享一下MySQL InnoDB之MVCC原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
    99+
    2022-10-19
  • MySQL mvcc奇怪的现象分析
    这篇文章主要讲解了“MySQL mvcc奇怪的现象分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL mvcc奇怪的现象分析”吧! 奇怪的现象1...
    99+
    2022-10-19
  • mysql中MVCC的作用是什么
    本篇文章为大家展示了mysql中MVCC的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明多版并发控制MVCC是MySQL InnoDB存储引擎实现隔离等级的具体方法,用于实现提交阅...
    99+
    2023-06-15
  • MYSQL事务的隔离级别与MVCC
    目录前言1. 事务(transaction)的起源1.1. 事务的定义1.2. 哪些存储引擎支持事务2. MySQL的事务语法2.1. 自动提交2.2. 手动操作事务2.2.1. 开...
    99+
    2022-11-13
  • 【Mysql】MVCC版本机制的多并发
    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 🛸Mysql专栏:Mys...
    99+
    2023-08-24
    mysql 数据库
  • MySQL中MVCC的正确打开方式
     最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号、删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的。经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解了MySQL中的MVCC。       ...
    99+
    2021-07-01
    MySQL中MVCC的正确打开方式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作