mysql mvcc 的理解
mvcc 全称 multiple version concurrency control 多版本并发控制,是数据库领域比较常用的一种非锁并发技术。
mysql 的innodb中,在RR、RC级别会使用mvcc来提升并发。
实现原理:
首先理解几个基本知识点。
一、mysql在行都设置了默认列(对查询不可见),包含有 data_trx_id、data_roll_ptr、db_row_id、delete bit
- db_row_id是在用户没设置聚集索引保留
- delete bit 删除标志
- data_trx_id 最近更新或创建 这条记录的 事务id
- data_roll_ptr 回滚指针(也称之为删除事务id,在事务中查找查找上个版本的记录就靠这个指针,指向了undo log的地址,可以把同一个事务中的多个版本理解为链式关系)
二、Read View:RR、RC级别,开启事务时,每个事务各自都会维护一份Read View,ReadView 中包含了当前DBMS中活跃的事务id列表(即begin开启了,但未commit的事务),后续简称RV。
三、事务select的检索的规则:
- 查找比当前事务id小的trx_id,这样能够保证查询出当前事务开启前已经写入或提交的数据。
- 查找行删除事务Id未设置或者删除事务Id值大于当前事务Id,这样能保证,当前事务开启后被删除的数据对当前事务是可见的。
- 匹配Read View 列表(因为前两条并能不保证mvcc的正确性,见下文举例)
- 比较RV中max(trx_id) 和 min(trx_id)
- 如果current_trx_id < min(trx_id) 说明要访问的版本早已经提交,对当前事务来说数据都是可见的
- 如果min<current_trx_id<max 说明当前事务可能正处于活动事务列表中,查找列表如果事务还存在,那么版本不可见从该行的roll_ptr指向的行获取值,如果不在列表说明事务已经提交了,数据可见。
- 如果current_trx_id >max 说明当前事务是在RV副本生成之后产生的,更新的数据应该不可见,从该行的roll_ptr指向的行获取值。
- 比较RV中max(trx_id) 和 min(trx_id)
看下具体过程:
当事务级别为默认级别RR时:
假设 有张表
test(bl varchar(20),id not null primary key)
有事务 A、B、C、D 分两个场景来看 RV的关系。
场景1:
RR级别时候,RV不会更新,一直保持开启事务时候生产的RV,RV=[1]当前数据不可用,需要查询历史版本,发现roll_ptr为空,无历史版本,古返回为空。
RC级别时候,每次查询RV会生成新的列表,最终RV为空,故直接返回行数据即可。

场景2 ,表初始数据是 "小明"
RR级别时也是一样,会一直持有同一张RV,RV=[1,2] ,会认为1,2 版本均不可用户,会寻找1,2版本的历史版本,返回值是 小明
RC级别的时候,RV会一直更新,RV=[2]会查找2的历史版本 trx_id=1的提交记录,小明1,以此类推。

能看出来 mysql innoDB实现的并不是纯粹的MVCC 模式,其中还加入了X锁。严格来讲应该是 “X锁+MVCC”来达到MVCC的目的。
mysql mvcc 的理解的更多相关文章
- mysql MVCC原理理解
MVCC多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了Inno ...
- 轻松理解MYSQL MVCC 实现机制
轻松理解MYSQL MVCC 实现机制 转载https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVC ...
- java面试一日一题:讲对mysql的MVCC的理解
问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...
- Mysql加锁过程详解(2)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Mysql加锁过程详解(3)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- mysql count的理解
mysql count的理解 1 select count(tel) as telcount from info;如果tel列有null 将不会被统计进去 2 count(*) 这样写性能更好 3 M ...
- 【MySQL】面试官:谈谈你对Mysql的MVCC的理解?
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问. 在Mysql的In ...
- 【Mysql】深入理解 MVCC 多版本并发控制
MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...
- 浅谈mysql mvcc
以下为个人理解,如有错误,还望指正!! mysql的大多数事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制,可以认为MVCC是行级锁的一个变种,但是它 ...
随机推荐
- php 接口获取公网ip并获取天气接口信息
<?php function get_ip(){ //判断服务器是否允许$_SERVER if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWA ...
- windows 10安装linux(ubuntu)子系统
windows10安装ubuntu子系统系统 之前一直在虚拟机中使用linux系统,但是不是很方便,后来发现windows下也有了linux系统.感觉还不错 1. 打开windows应用市场micro ...
- Bug搬运工-CSCvm33229:Environment summary not available on COS APs
还是关于温度的问题, Environment summary not available on COS APs CSCvm33229 Description Symptom:From WLC CL ...
- 《TCP/IP网络编程》读书笔记
1.Windows 下的 socket 程序和 Linux 思路相同,但细节有所差别(1) Windows 下的 socket 程序依赖 Winsock.dll 或 ws2_32.dll,必须提前加载 ...
- C/C++中size_t潜在的问题
在C++中,利用数组下标访问数组元素时,常常将下标类型定义为size_t类型,因为正常来说,数组的下标就是size_t类型.例如这样: for (size_t i = 0; i < contai ...
- js中ES6的Set的基本用法
ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const s = new Set(); [2,3,5,4,5,2,2].forEach(x => s. ...
- idea如何提取变量(拆分变量赋值和声明)
需求描述: 我们时常遇到某个在某个局部作用域声明的变量,想要用在另一个地方,此时就需要在作用域外部声明变量,在作用域中给变量赋值. 在eclipse中这个功能和提取变量在一起,我们可以方便的拆分变量的 ...
- 移动端,ajax 动态加载的元素,为动态添加的一系列同个类名的元素添加点击事件
背景:一个列表页,有一系列同类名的元素,需要为每一个动态添加的列表项添加事件: 点击选择下图中不同的文档类型,再通过 ajax 动态加载不同的文档. 使用过的方法: 1.通知 jquery 的 $(s ...
- 一个HTTP数据包的奇幻之旅
我是一个HTTP数据包,不知谁创建了我,把我丢到这个房间. 突然,来了一个大汉,我吓得缩到角落. “该启程了,站起来”. “去哪里啊?” 我弱弱的问. “还能去哪里,你是一个数据包,当然要出远门,完成 ...
- duv中内容不换行的解决办法
<div style='width: 100px;display:block;word-break: break-all;word-wrap: break-word;'> 内容超出div宽 ...