MySQL MVCC 概述
文章目录
- MVCC(Muti Version Concurrency Control) 的概念
- 什么是当前读和快照读
- 背景
- 总结
- undo 日志
- InnoDB 中的 MVCC
- InnoDB 中的 MVCC 与事务隔离级别的关系
- InnoDB 中的 MVCC 实现原理
MVCC(Muti Version Concurrency Control) 的概念
MVCC
, 是一种多版本并发控制机制。通过 MVCC
,可以极大地提升数据库的操作并发量, 在不同的数据库, 不同的存储引擎中的实现方法也不一样, 大都是基于乐观锁和悲观锁来实现的。
什么是当前读和快照读
- 当前读
当前读意思就是读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录, 会对读取的记录进行加锁。
像select lock in share mode
(共享锁),select for update
,update
,insert
,delete
(排他锁),这些操作都是当前读的一种。 - 快照读
快照读即不加锁的非阻塞读, 读取的是当前事务下第一次执行 select 时最新的版本, 注意区别, 这里的当前事务下第一次执行 select 时最新的版本并不能保证是最新的版本,如果在当前事务下执行第一次 select 之后, 有其他事务对记录进行了修改并提交,则当前读的记录版本则变成了历史版本。
快照读的前提是事务隔离级别不是串行级别, 串行下的快照读将会退化成当前读。快照读是基于提高并发性能考虑的,是基于 MVCC 来实现的。
背景
最早的数据库系统,只有读读之间可以并发,读写,写读,写写之间都要阻塞。在引入 MVCC
之后,只有写写之间相互阻塞,其他的三种操作都可以并行,这样大幅度提高了 InnoDB
的并发量。
总结
MVCC 就是为了实现读-写冲突不加锁, 将当前读变成了快照读。当前读实际上是一种加锁的操作,是悲观锁的实现。 MVCC 的核心理念就是维持一条记录的多个版本, 使得读写操作没有冲突。
undo 日志
undo log
主要分为两种:
- insert undo log
代表事务在 insert 新记录时产生的 undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃。 - update undo log
代表事务在进行 update 或 delete 时产生的 undo log ,不仅在事务回滚时需要,在快照读时也需要,所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被 purge 线程同一清除。
关于 MySQL purge 线程的介绍,请移步 MySQL purge 线程.md。
InnoDB 中的 MVCC
InnoDB 中的 MVCC 与事务隔离级别的关系
MySQ
中支持 MVCC
的引擎是 InnoDB
,且 MVCC
只在 READ_COMMITED
和 REPEATABLE_READ
两个隔离级别下工作。
MVCC
的作用用简单的话概括就是对数据库的任何修改的提交都不会直接覆盖之前的数据,而是产生一个新的版本与老版本共存,使得读数据的时候可以完全不用加锁。这样读某一个数据时,事务可以根据当下的隔离级别来选择读取哪个版本的数据,这个过程中完全不需要加锁。所以根据这个思想,实现两个隔离级别就变得非常容易:
READ_COMMITTED
: 一个事务读取数据时总是读取这个数据最近一次被commit
的版本。REPEATABLE_READ
: 一个事务读取数据时总是读取当前事务开始之前最后一次被commit
的版本。
InnoDB 中的 MVCC 实现原理
InnoDB
中每行有三个隐藏列:
6Byte, DB_TRX_ID
: 行事务ID
, 记录的是上一次记录增删改被提交后的事务ID
, 就是被经常提起的创建版本号和删除版本号;7Byte, DB_ROLL_PTR
: 回滚指针, 指向undo_log
,undo_log
存储于rollback segment
区域, 用于保存事务开始之前的快照;6Byte, DB_ROW_ID
: 行ID
, 可以理解为隐藏的主键, 插入新行时单调递增。
MySQL MVCC 概述相关推荐
- 01 MySQL锁概述
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...
- mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制
轻松理解MYSQL MVCC 实现机制 轻松理解MYSQL MVCC 实现机制 #### 1. MVCC简介 ##### 1.1 什么是MVCC MVCC是一种多版本并发控制机制. ##### 1.2 ...
- mysql程序,各种MySQL程序概述(转)
各种MySQL程序概述(转)[@more@]所有使用mysqlclient客户库与服务器通信的MySQL客户使用下列环境变量: 名字 说明 MYSQL_UNIX_PORT 缺省套接字:用于连接loca ...
- mysql mvcc
mysql MVCC MVVC 实现:排他锁+undolog+版本事务链+一致性read-view视图+版本事务链匹配规则 一致性非锁定读 在 InnoDB 存储引擎中,多版本控制 (multi ve ...
- mysql MVCC不能避免幻读
幻读 并发情况下,A事务读取了一条记录,此时B事务插入一条记录,A事务又读取,读到了两条数据,此时就造成了读取数据不一致,一般到这幻读通常说的是事务提交了,而且是指删除.插入带来的问题. 问题 mys ...
- mysql mvcc实现乐观锁_MVCC-乐观锁
Mysql MVCC是乐观锁的一种实现方式,但并不是MVCC就等于乐观锁.乐观锁( Optimistic Locking)其实是一种思想.相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以 ...
- mysql mvcc update_MySql MVCC机制
Multiversion concurrency control 多版本并发控制 并发访问(读或者写)数据库时,对正在事务内处理的数据做多版本的管理,用来避免由于写操作的堵塞,而引发读操作失败的并发问 ...
- 从ReadView深入理解MySql MVCC原理
MySql MVCC 机制 在说MVCC机制前我们先了解ReadView. ReadView是什么呢?在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下 参 ...
- MySQL系列(一) MySQL体系结构概述
1 MySQL 的体系结构 连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 缓冲组件 插件式存储引擎(体系结构的核心) 物理文件 2 InnoDB 概述 InnoDB存储引 ...
最新文章
- 《从零构建前后分离web项目》:开篇 - 纵观WEB历史演变
- 计算机应用基础专业自我鉴定范文毕业生,中专生计算机专业自我鉴定(7页)-原创力文档...
- 【转】匈牙利命名法(Hungarian Notation)
- 基于Redis的分布式锁实现
- sklearn自学指南(part38)--OPTICS
- oracle入库的速度能到多少_多线程能提高Oracle的入库速度吗
- 【Spark】一条 SQL 在 Apache Spark 之旅(上)
- 「luogu2414」[NOI2011]阿狸的打字机
- Ruby 28 岁生日快乐!
- oracle中with子句的用法(转)
- 人口模型(Malthus+Logistic)附Matlab代码
- excel max函数的使用
- 08Spring Boot自定定义配置
- ZlycerQan的 八云蓝(ran )
- 韦东山第二期课程内容概要
- Mac 使用音频工具分析音频数据
- 初步使用计算机教学设计,【教资笔试——科目三】信息技术教学设计范例
- 解决ORA-01111, ORA-01110, ORA-01157
- c++软件开发面试旋极面试题_c++开发程序员面试拼多多面试题整理(含答案)
- 大力智能作业灯 助力家长解决辅导孩子写作业难题
热门文章
- ronald aai_AAI的完整形式是什么?
- 单层神经网络线性回归_单层神经网络| 使用Python的线性代数
- js math.hypot_带有Python示例的math.hypot()方法
- np.copysign_带有Python示例的math.copysign()方法
- 华为交换机telnet和ftp服务开启/关闭命令
- org.springframework.data.redis.serializer.SerializationException: Cannot serialize;
- jq获取页面高度_JQ获取窗口文档等等高度总结!
- java变量用来干嘛_Java
- 画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图
- linux bc命令全称,Linux bc 命令