什么是MVCC

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

举个例子,程序员A正在读数据库中某些内容,而程序员B正在给这些内容做修改(假设是在一个事务内修改,大概持续10s左右),A在这10s内 则可能看到一个不一致的数据,在B没有提交前,如何让A能够一直读到的数据都是一致的呢

有几种处理方法:

第一种:基于锁的并发控制,程序员B开始修改数据时,给这些数据加上锁,程序员A这时再读,就发现读取不了,处于等待情况,只能等B操作完才能读数据,这保证A不会读到一个不一致的数据,但是这个会影响程序的运行效率。

还有一种就是:MVCC,每个用户连接数据库时,看到的都是某一特定时刻的数据库快照,在B的事务没有提交之前,A始终读到的是某一特定时刻的数据库快照,不会读到B事务中的数据修改情况,直到B事务提交,才会读取B的修改内容。

当前读

当前读一定是读取的是记录的最新版本,select lock in share mode(共享锁),select for update,update,insert,delete这些操作都是一种当前读。读取时要保证其他并发事务不能修改当前记录,会对读取的记录加锁

快照读

不加锁的select操作就是快照读,即不加锁的非阻塞读,快照读的出现是基于提高并发性能的考虑,快照读的实现是基于MVCC,MVCC可以认为是行锁的一个变种,避免了加锁操作,降低开销,既然MVCC是多版本并发控制,字面上意思都知道了,可能读取到的并不一定是数据的最新版本。这里想一个问题,如果进行数据值的插入的时候,除了保留最新结果外,还会有很多历史版本,历史版本都存在undolog里,磁盘上,回滚的时候只需要找到当前行的上一个版本的数据就行了。当前行的历史版本数据存在undolog里,从undolog里取到当前行的结果返回就ok了

实现原理

MVCC(多版本并发控制)指的是维持一个数据的多个版本,使得读写操作没有冲突,快照读是MySQL为实现MVCC的一个非阻塞的读功能,MVCC模块在MySQL中的具体实现是由三个隐式字段、undolog、read view 这三个组件来实现的。 说白了MVCC就是为了实现读(select)-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现。

数据库并发场景有三种,分别为:

1、读读:不存在任何问题,也不需要并发控制

2、读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读

3、写写:有线程安全问题,可能存在更新丢失问题

MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每一个修改保存一个版本,版本与事务时间错关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决以下问题:

1、并发读写DB时候,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能。

2、解决了脏读,幻读,不可重复读等事务隔离问题,但是不能解决更新丢失问题。

每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID等字段

  • DB_TRX_ID: 6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID

  • DB_ROLL_PTR: 7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)

  • DB_ROW_ID: 6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚集索引

MySQL学习笔记(九)MVCC相关推荐

  1. MySQL学习笔记(四)

    MySQL学习笔记(四) MySQL外键约束 通过建立外键,设置表与表之间的约束性,限制数据的录入. 主表(class) 序号 部门名称 部门地址 1 市场 北京 2 人事 上海 3 工程 南京 子表 ...

  2. JavaEE 企业级分布式高级架构师(六)MySQL学习笔记(6)

    MySQL学习笔记 性能优化篇 性能优化的思路 慢查询日志 慢查询日志介绍 开启慢查询功能 演示一 演示二 分析慢查询日志 MySQL自带的mysqldumpslow 使用percona-toolki ...

  3. MySQL 学习笔记②

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/BV1Kr4y1i7ru 资料链接 ...

  4. MySQL学习笔记——尚硅谷李玉婷经典版MySQL基础笔记(一)

    MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) MySQL学习笔记目录 MySQL学习笔记--尚硅谷李玉婷经典版MySQL基础笔记(一) 一.基础知识 1.MySQL的语法规范 2. ...

  5. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作 #创建 #数据库的创建 USE mysql; CREATE DATABASE db_x; #删除 #删除数据库 DROP DA ...

  6. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  7. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  8. MySQL学习笔记07【事务、用户管理和权限管理】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  9. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  10. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

最新文章

  1. Bzoj4558 [JLoi2016]方
  2. win10应用商店打不开_电脑打不开exe程序|Win10提示exe不是有效32应用程序
  3. 用 Redis 实现分布式锁(Java 版)
  4. Python str 函数 - Python零基础入门教程
  5. nasa注册_今天是黑洞星期五!
  6. eclipse基本操作
  7. UE中使用正则表达式的一些技巧
  8. vue引入字体文件踩坑
  9. 2021 9.14 p.m.小结 以及 数独问题探索(T3)
  10. AD7606数据采集模块使用方法
  11. java jvm dump文件_各种获取JVM DUMP的方法
  12. python自动按键脚本
  13. 蓄电池在线监测、蓄电池在线核容系统
  14. 禾瘦美学馆,不是谁NB谁做,是谁开店谁NB
  15. 5号AA电池,7号AAA电池
  16. vue生命周期中的modle→view过程
  17. Qt for linux 安装
  18. python制作图片_python制作斗图生成器
  19. vue中不同模块间的跳转
  20. 美柚社区精选:贴心宝妈的八大育儿经验

热门文章

  1. 如何将图片上的文字识别成可修改的文本
  2. C#使用Microsoft.office.interop.PowerPoint生成PPT
  3. 4、不准用组函数(Max),取得最高薪水【bjpowernode34道SQL题】
  4. 海思官方SDK Hi3516EV200_SDK_V1.0.1.0的编译教程
  5. 图像注意力机制汇总学习
  6. 「Spring Boot」接口幂等性的4种实现方案
  7. Python文件操作之把臂入林
  8. python爬虫导入自己事先定义好的配置文件,在服务器运行出现ImportError: No module named 'a005_BanGuMi_spider_subject' 错误
  9. 2023交易猫源码跳转APP
  10. IDE输入import语句自动消失