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的检索的规则:

  1. 查找比当前事务id小的trx_id,这样能够保证查询出当前事务开启前已经写入或提交的数据。
  2. 查找行删除事务Id未设置或者删除事务Id值大于当前事务Id,这样能保证,当前事务开启后被删除的数据对当前事务是可见的。
  3. 匹配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指向的行获取值。

看下具体过程:

当事务级别为默认级别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 的理解相关推荐

  1. mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制

    轻松理解MYSQL MVCC 实现机制 轻松理解MYSQL MVCC 实现机制 #### 1. MVCC简介 ##### 1.1 什么是MVCC MVCC是一种多版本并发控制机制. ##### 1.2 ...

  2. 从ReadView深入理解MySql MVCC原理

    MySql MVCC 机制 在说MVCC机制前我们先了解ReadView. ReadView是什么呢?在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下 参 ...

  3. Mysql加锁过程详解(2)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. MySQL索引的理解学习,面试不问索引原理就是事务原理

    目录 MySQL执行SQL的整体流程 引言, MySQL索引底层学习原因 磁盘介绍(理解磁盘IO) 索引底层数据结构B+树 B+树(聚集索引) B+树(辅助索引) 思考一下为何使用B+树结构, 不是B ...

  5. Mysql加锁过程详解(3)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  6. 面试 - 要不简单聊一下你对MySQL索引的理解?

    转载自  面试 - 要不简单聊一下你对MySQL索引的理解? MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来. 一.索引是什么? 索引是帮助MySQL高效获取数据的 ...

  7. MySQL引擎的理解

    MySQL引擎的理解 MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎.在MySQL中,不需要在整个服务器中使用同一种引擎,应该针对具体的要求,对每一个表使用不同的 ...

  8. mysql mvcc

    mysql MVCC MVVC 实现:排他锁+undolog+版本事务链+一致性read-view视图+版本事务链匹配规则 一致性非锁定读 在 InnoDB 存储引擎中,多版本控制 (multi ve ...

  9. mysql MVCC不能避免幻读

    幻读 并发情况下,A事务读取了一条记录,此时B事务插入一条记录,A事务又读取,读到了两条数据,此时就造成了读取数据不一致,一般到这幻读通常说的是事务提交了,而且是指删除.插入带来的问题. 问题 mys ...

最新文章

  1. Hadoop基础-网络拓扑机架感知及其实现
  2. G - Shuffle‘m Up POJ - 3087
  3. DPDK — 在 NFV 中的应用
  4. 基于VUE只是作为模版引擎的前后端分离
  5. 华中农业大学第五届程序设计大赛网络同步赛-G
  6. JavaSE--类加载器
  7. 【转】微服务实战(六):选择微服务部署策略
  8. eCognition易康domain is empty原因
  9. HBase 源码解析
  10. 大数据入门介绍和学习路线
  11. 《机会的数学》--陈希孺
  12. c语言蝴蝶图案代码,通达信指标公式,临界点蝴蝶图案出现,暴涨趋势出现(附源码)...
  13. CISP 考试教材《第 10 章 知识域:软件开发安全》知识整理
  14. 【数据分享】全国县市2000-2020年医疗卫生机构床位数数据(excel和shp格式)
  15. 使用对话框模板创建一个InputBox()在C + +
  16. 记录舒马赫告别F1车坛(转载)
  17. Meeting Rooms II -- LeetCode
  18. 微信小程序 之radio应用实例(选择收货地址)
  19. @Transactional注解说明
  20. Loner_li 机试题 将数字 例如12345.7895”,用程序实现显示壹万贰仟叁佰肆拾伍圆柒角玖分的方式

热门文章

  1. React传递参数的多种方式
  2. SQLyog 报错2058 :连接 mysql 8.0.12 解决方法
  3. 卡尔曼滤波—建立状态空间表达式
  4. EL表达式中,param和requestScope的区别
  5. springmvc错误java.lang.IllegalArgumentException
  6. 正向最大匹配中文分词算法
  7. 玩转jquery插件之flexigrid 【转】
  8. 谈谈var变量提升以及var,let,const的区别
  9. C++---模板特化
  10. JavaScript学习(八十三)—JavaScript书写位置、注释、以及输入输出语句