MySQL的MVCC机制

MVCC机制

使用MVCC(Multi-Version Concurrency Control,多版本的并发控制协议)机制来实现可重复读(REPEATABLE READ)的隔离级别

MVCC最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,是通过保存数据在某个时间点的快照来实现的,多个版本的数据可以共存,主要是依靠数据的四个隐藏列(也可以称之为标记位)和undo log。其中数据的隐藏列包括了隐含的自增主键(DB_ROW_ID),最近更改的事务ID(DB_TRX_ID)、undo log的指针(DB_ROLL_PTR)、索引删除标记(FLAG数据被删除时,并不是立即删除,而是打上删除标记,进行异步删除);在进行数据修改时,当前记录会进行加锁,把修改前的数据放入undo log中,通过undo log的指针与数据进行关联,如果修改失败,则恢复undo log中的数据

事务对一条数据进行修改时,undolog日志会成为一条记录版本的链表,链首是最新的旧记录,链尾是最早的旧记录

事务隔离级别READ COMMITTED时,对于快照数据,总是读取被锁定行的最新一份快照数据

事务隔离级别REPEATABLEREAD时,对于快照数据,总是读取事务开始时的行数据版本

ReadView

ReadView包含四个字段

  • m_ids 当前活跃的事务id集合
  • min_trx_id 最小活跃事务id
  • max_trx_id 最大事务id,已创建的最大事务id
  • creator_trx_id 快照读创建者的事务id

在READ UNCOMMITED的隔离级别下,select都是当前读;而在SERIALIZABLE级别下,是通过表锁来限制数据,所以MVCC是在READ COMMITED和REPEATABLE READ的级别下才会生效

在READ COMMITED级别下,每一次select都会重新将系统中所有活跃事务拷贝到每一个列表中生成ReadView。

在REPEATABLE READ级别下,每个事务read时,会将当前系统中所有活跃事务拷贝到一个列表中生成ReadView,后续所有select都复用该ReadView

当执行查询sql时会生成一致性视图ReadView,它是由执行查询时所有未提交事务id数组(m_ids)和已创建的最大事务id(max_trx_id)组成,查询的数据结果需要跟ReadView做对比从而得到快照结果
zhhll.icu/2021/数据库/关系...

本文由mdnice多平台发布

相关推荐
Re.不晚1 分钟前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设10 分钟前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据31 分钟前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_7903009636 分钟前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919101 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓1 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525291 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊2 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha2 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞2 小时前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle