Mysql-MVCC

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Mysql InnoDB存储引擎基于Multi-Version Concurrency Control(MVCC,多版本的并发控制协议)实现。MVCC是通过保存数据在某个时间点的快照来实现的;优点是:读不加锁,读写不冲突。


Mysql InnoDB存储引擎基于Multi-Version Concurrency Control(MVCC,多版本的并发控制协议)实现。MVCC是通过保存数据在某个时间点的快照来实现的优点是:读不加锁,读写不冲突。

 

 原理

1 实现原理

InnoDB的MVCC可以是通过在每行记录中保存两个隐藏的列来实现的,创建事物id,删除事物id。开始一个新的事务,系统版本号(可以理解为事务的ID)就会自动递增,事务开始时刻的系统版本号会作为事务的ID。

Innodb最基本行记录(row中包含一些额外的存储信息:DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT

列名

长度

备注

DATA_TRX_ID

6字节

标记了最新更新这条行记录的transaction id,每处理一个事务,事物值自动+1

DATA_ROLL_PTR

7字节

指向当前记录项的rollback segment的undo log记录,找之前版本的数据就是通过这个指针

DB_ROW_ID

6字节

innodb自动产生聚集索引时,聚集索引包括这一列,否则聚集索引中不包括这个值。

DELETE BIT

 

位用于标识该记录是否被删除,这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在commit的时候

 

2 Select

当隔离级别是REPEATABLE READ时select操作,InnoDB查询时必须保证每行数据符合两个条件:

InnoDB只查找版本号必须小于等于事务版本的数据行。这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行。

行的删除操作的版本一定是未定义的或者大于当前事务的版本号,确定了当前事务开始之前,行没有被删除。

 

3 实现

MVCC有下面几个特点(看起来有点乐观锁的味道):

a、每行数据都存在一个版本。

b、每次数据更新时都更新该版本 修改时Copy出当前版本随意修改,个事务之间无干扰。

c、保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)。

 

Innodb的MVCC实现方式如下:

a、事务以排他锁的形式修改原始数据,

b、把修改前的数据存放于undo log,通过回滚指针与主数据关联

c、修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)

 

 MVCC示例

接下来讲述在REPEATABLE READ隔离级别下,MVCC具体是如何操作的

 

1 表结构

假设存在表user,结构如下:

2cd46eb48ead102977e55d7a4a04c45bc8dad678

加上DATA_TRX_ID、DATA_ROLL_PTR、DB_ROW_ID后的结果如下:

2e9c10b88906835f32b89dd14c54586805c95314

 

2 insert

假设当前事务id=1,插入一条记录,sql如下:

insert into user value("a1")

结果数据如下:

653ec2d114308c83c33f2e4c9eea5410a64958d5

 

3 update

假设原始数据如下:

937b9979277abc370c7ecd63ca26c22ee6953382

假设当前事务id=2,更新sql如下:

update user set name="a2" where id =1;

更新时数据变动如下:

c8c8ea9cd1070c9c7737aa4e29b9fa231267bfd1

事务执行过程:

事务开始.

记录name=a1 到undo log.

修改name=a2、DATA_ROOL_PTR=UNDO LOG的记录id

记录name=a2 到redo log.

将redo log、undo写入磁盘。

事务提交

说明:如果undo log一直不删除,则会通过当前记录的回滚指针回溯到该行创建时的初始内容,所幸的时在Innodb中存在purge线程,它会查询那些比现在最老的活动事务还早的undo log,并删除它们,从而保证undo log文件不至于无限增长。

 

4   delete

假设原始数据如下:

719f9241cc76c903b6156f17169613cbd8b0ed2f

 

假设当前事务id=3,delete sql如下:

delete from user where id =1

50d23ac986b7e0d3e9839536566888bcfc002b39

事务执行过程:

事务开始.

记录原数据到undo log.

修改记录的DELETE BIT=1、DATA_ROOL_PTR=UNDO LOG的记录id

记录删除操作到redo log.

将redo log、undo写入磁盘。

事务提交

 

 

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10天前
|
存储 人工智能 数据库
到底什么是AI Agent?
Agent是具备感知、决策与行动能力的智能体,通过大模型(LLM)结合记忆(Memory)和工具(Tools)调用,实现自主规划与执行任务,如小爱同学自动点餐。其核心为:LLM + Memory + Tools + Planning。
385 7
sign check fail:check Sign and Data Fail报错攻略
错误码: com.alipay.api.AlipayApiException: sign check fail: check Sign and ​Fail            报错原因:验签失败 ,未使用正确的支付宝公钥     在新版接口的调用过程中,常常出现此报错。
5548 12
|
2月前
|
SQL 人工智能 自然语言处理
Spring Boot + GPT:我做了一个能自己写 SQL 的后端系统
本文介绍如何基于Spring Boot与GPT(或国产大模型如通义千问、DeepSeek)构建智能后端系统,实现自然语言自动生成SQL。系统采用分层架构,集成AI语义理解、SQL安全验证与执行功能,提升开发效率并降低数据查询门槛,兼具安全性与可扩展性。
237 7
|
9月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
938 4
|
存储 Java
Java 链接表(链表)详解与实现
Java 链接表(链表)详解与实现
563 2
|
存储 XML 数据安全/隐私保护
PyMuPDF 1.24.4 中文文档(八)(2)
PyMuPDF 1.24.4 中文文档(八)
1376 1
|
存储 缓存 Java
Java中的链表
Java中的链表
296 0
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
SQL 运维 数据管理
sql管理工具archery简介
Archery是一个多公司采用的SQL管理工具,提供权限管理、工作流配置、实例管理、SQL审核、查询、优化及通知功能。它支持多级审批和不同云环境的数据管理。尝试Archery的SaaS版本可访问[ArcheryDMS.com](https://archerydms.com/home/)。此外,NineData是一个综合平台,包含SQL开发、数据复制等功能,适应混合云和多云环境,由叶正盛创建,详情见[Ninedata.cloud](https://www.ninedata.cloud/aboutus)。
992 0
|
NoSQL Redis 数据安全/隐私保护
【Docker】安装Redis 通俗易懂 亲测没有任何问题 只需三步
【Docker】安装Redis 通俗易懂 亲测没有任何问题 只需三步
627 0

热门文章

最新文章