首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【高性能MySQL】多版本并发控制MVCC

【高性能MySQL】多版本并发控制MVCC

原创
作者头像
用户9295575
发布2025-01-02 22:23:28
发布2025-01-02 22:23:28
2950
举报

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,一般都同时实现了多版本并发控制MVCC)。

可以认为MVCC是行级锁的一个变种。但是在很多情况下避免了加锁操作。因此开销更低。

MVCC的实现,是通过保存数据在某个时间点的快照来实现。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏列来实现的。一个保存了行的创建时的系统版本号,另一个保存行的过期时(删除时)的系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

下面看一下REPEATABLE READ隔离级别下的MVCC具体如何操作的:

SELECT

InnoDB会根据以下两个条件检查每行记录:

  • InnoDB 只查版本号小于或者等于当前事务版本的数据行,保证事务读取的行,要么是在事务开始前已经存在的行,要么是事务本身修改的行。
  • 行的删除版本号为空或者大于当前事务版本。保证事务读取到的行,在事务开始前没有被删除。

只有满足上述两个条件的行,才能作为查询结果被返回。

INSERT

InnoDB 会为新插入的行保存当前系统版本号作为行版本。

DELETE

InnoDB 会为删除的行保存当前系统版本号作为行删除标志。

UPDATE

InnoDB会新增一行,为新插入的行保存当前系统版本号作为行版本。并且保存当前系统版本号作为删除标志到原来的行。

保存这两个系统版本号,使大多数读操作都可以不用加锁。提高读数据的性能,并能保证读到符合标准的行。不足之处是每行记录需要额外的存储空间。

MVCC只在REPEATABLE READ 和 READ COMMITTED 两个隔离级别下工作。因为READ UNCOMMITED 总是读取的最新的数据行,不是当前事务版本的行。SERIALIZABLE则会对所有读取的行都加锁。

每天学习一点!每天进步一点!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档