什么叫mvcc

多版本并发控制,如果只有一个事务或者单线程对数据操作的时候。

在现在主流生产环境中不可能只有一个线程对数据库操作,这个时候就需要保障数据一致性。

那么在并发情况下有哪些应用场景呢?

1.读读
不存在任何问题,不需要任何锁的添加,不需要并发控制

2.写写
可能产生丢失跟新的可能性

3.读写
并发读写怎么保证?加锁,但是效率很低————mvcc,是为了解决并发情况下读写的数据问题

前置技能:

1.当前读:
读取的永远是数据库中记录的最新数据

哪些操作会造成当前读:
1.updata
2.insert
3.delete
4.select…for updata
5.select…lock in share mode

2.快照读:
读取的不是最新的数据,而是某个历史版本的数据

那些会引起快照读:存粹的select

快照问题:要是数据库100g那么我全部都要拍下来?

每一行数据上面可以有多个版本,每一个版本是谁修改他的哪一个事务修改他的这个transaction_id一一绑定的。

所以这个100g的快照不是对100g,不是复制粘贴形成快照,而是读取的是row trxI_ID,读取到的是当前事务最新的版本号。
因为transaction_id是顺序递增的,我们把已经提交的事务ID的最大值记成up_limit_id

我们开启事务后,我们读取数据,如果我记录下来后大于up_limit_id我们就不认!

什么意思,我来们来举个例子:

1到5按顺序来执行,这里Q1,Q2的值是多少?


为什么b是20不是19??


上面说了updata触发当前读,所以读得是最新的数据

我们继续一步一步分析:

假设数据库里面最后提交的版本号为999

第一步:

先是a开启了事务,再是b开启事务,再是c开启事务,并且都记录up_limit_id=999(最大值)

第二步

事务c修改了年龄

第三步

事务b修改,updata触发快照读,直接修改数据库层面的值,拿数据库里面最新的数据

拿到的是1002号,也就是事务c的版本号,接着在这个版本号上进行修改。结果就是



事务b再去读数据的时候,因为最新修改的1001号修改的,所以拿到的是1001,正好和自己匹配,要认了所以年龄是20岁

第四步:

a事务记录的最后版本是999。1001不符合继续往上找,1002还是不符合,读到999,符合了,返回。显示18。

MVCC及其原理详解相关推荐

  1. MySQL MVCC底层原理详解

    1 简介         MVCC(Multi-Version Concurrency Control)多版本并发控制,是用来在数据库中控制并发的方法,实现对数据库的并发访问用的.在MySQL中,MV ...

  2. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  3. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  4. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  5. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  6. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  7. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  8. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  9. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

最新文章

  1. android 图片水印处理 文字倾斜处理
  2. shell 压测_【原】shell编写一个简单的jmeter自动化压测脚本
  3. LINUX CP 命令强制覆盖功能开启/关闭
  4. 【转】Linux系统编程---dup和dup2详解
  5. (十四)【RecSys 2016】Personalized Recommendations using Knowledge Graphs: A Probabilistic【看不懂】
  6. pillow支持python 2和python 3_python3读取图像并可视化的方法(PIL/Pillow、opencv/cv2)...
  7. Mycat高可用架构原理_Mycat集群搭建_HA高可用集群_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0027
  8. 微信小程序支付返回信息为空
  9. Android 集成Unity项目
  10. selenium webdriver如何操作select下拉框
  11. Atitit.软件开发概念(11)--网络子系统--url编码 空格问题URLEncoder java js php
  12. 数学建模常用模型和算法介绍
  13. Chrome 中迅雷的插件(正确的下载地址)下载以及安装(一)
  14. 利用GeoLite2-City.mmdb开源库将IP转换成经纬度—java项目小Demo
  15. 国内外最顶级的8大plm项目管理系统
  16. 成功粉碎北信源监控程序vrvedp_m.exe ,vrvrf_c64.exe,svchost.exe,vrvrf_c.exe
  17. 如何使用荣耀手机的计算机功能,华为荣耀手机投屏电脑教程
  18. 统计假设检验之显著性检验(significance test)
  19. 压力传感器的制作材料
  20. 35岁前要培养的66种思维(中)

热门文章

  1. H5 语音合成播报功能
  2. SpringBoot+Vue实现前后端分离的小而学在线考试系统
  3. centos7查看进程ps_centos如何查看进程
  4. 2004年中国各省市自治区GDP排名
  5. 学生成绩管理系统mysql课程设计_学生成绩管理系统数据库课程设计报告.doc
  6. oracle 建分区索引_Oracle的分区表和Local索引创建与维护
  7. 设计和QQ一样动态登录界面
  8. matlab进行道格拉斯筛选,用MATLAB计算柯布道格拉斯函数,需要计算程序,急!谢谢大神...
  9. Packettracer--计算机网络实验
  10. UOS V20 SP1 升级到Update1 后WPS无法打开