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的目的。
转载于:https://www.cnblogs.com/luoluoshidafu/p/11528784.html
mysql mvcc 的理解相关推荐
- mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制
轻松理解MYSQL MVCC 实现机制 轻松理解MYSQL MVCC 实现机制 #### 1. MVCC简介 ##### 1.1 什么是MVCC MVCC是一种多版本并发控制机制. ##### 1.2 ...
- 从ReadView深入理解MySql MVCC原理
MySql MVCC 机制 在说MVCC机制前我们先了解ReadView. ReadView是什么呢?在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下 参 ...
- Mysql加锁过程详解(2)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- MySQL索引的理解学习,面试不问索引原理就是事务原理
目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...
- Mysql加锁过程详解(3)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 面试 - 要不简单聊一下你对MySQL索引的理解?
转载自 面试 - 要不简单聊一下你对MySQL索引的理解? MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来. 一.索引是什么? 索引是帮助MySQL高效获取数据的 ...
- MySQL引擎的理解
MySQL引擎的理解 MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎.在MySQL中,不需要在整个服务器中使用同一种引擎,应该针对具体的要求,对每一个表使用不同的 ...
- mysql mvcc
mysql MVCC MVVC 实现:排他锁+undolog+版本事务链+一致性read-view视图+版本事务链匹配规则 一致性非锁定读 在 InnoDB 存储引擎中,多版本控制 (multi ve ...
- mysql MVCC不能避免幻读
幻读 并发情况下,A事务读取了一条记录,此时B事务插入一条记录,A事务又读取,读到了两条数据,此时就造成了读取数据不一致,一般到这幻读通常说的是事务提交了,而且是指删除.插入带来的问题. 问题 mys ...
最新文章
- Hadoop基础-网络拓扑机架感知及其实现
- G - Shuffle‘m Up POJ - 3087
- DPDK — 在 NFV 中的应用
- 基于VUE只是作为模版引擎的前后端分离
- 华中农业大学第五届程序设计大赛网络同步赛-G
- JavaSE--类加载器
- 【转】微服务实战(六):选择微服务部署策略
- eCognition易康domain is empty原因
- HBase 源码解析
- 大数据入门介绍和学习路线
- 《机会的数学》--陈希孺
- c语言蝴蝶图案代码,通达信指标公式,临界点蝴蝶图案出现,暴涨趋势出现(附源码)...
- CISP 考试教材《第 10 章 知识域:软件开发安全》知识整理
- 【数据分享】全国县市2000-2020年医疗卫生机构床位数数据(excel和shp格式)
- 使用对话框模板创建一个InputBox()在C + +
- 记录舒马赫告别F1车坛(转载)
- Meeting Rooms II -- LeetCode
- 微信小程序 之radio应用实例(选择收货地址)
- @Transactional注解说明
- Loner_li 机试题 将数字 例如12345.7895”,用程序实现显示壹万贰仟叁佰肆拾伍圆柒角玖分的方式
热门文章
- React传递参数的多种方式
- SQLyog 报错2058 :连接 mysql 8.0.12 解决方法
- 卡尔曼滤波—建立状态空间表达式
- EL表达式中,param和requestScope的区别
- springmvc错误java.lang.IllegalArgumentException
- 正向最大匹配中文分词算法
- 玩转jquery插件之flexigrid 【转】
- 谈谈var变量提升以及var,let,const的区别
- C++---模板特化
- JavaScript学习(八十三)—JavaScript书写位置、注释、以及输入输出语句