前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL MVCC 多版本并发控制

MySQL MVCC 多版本并发控制

作者头像
Li_XiaoJin
发布2022-06-10 21:27:38
5640
发布2022-06-10 21:27:38
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

关于多版本并发控制的一些内容。 主要来自于《高性能MySQL》,做笔记。

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

主要介绍 InnoDB 的 MVCC 实现。

InnoDB 的 MVCC 是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(或者删除时间)。存储的实际不是时间,可以看做是系统版本号。

每次开启一个事务时,系统版本号会进行递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录进行比较。

在 REPEATABLE READ 隔离级别下,MCCC 操作如下:

  1. SELECT InnoDB 会根据两个条件检查每行记录:
    1. InnoDB 只查找早于当前事务版本的数据行,这样确保了事务读取的行,要么是开始前已存在的,要么是事务自身插入或修改的。
    2. 行的删除版本要么未定义,要么大于当前事务,可以确保事务读取到的行,在事务开始之前删除。

只有符合以上两个条件才会进行返回查询的结果。

  1. INSERT InnoDB 为新插入的每一行保存当前系统版本号作为行版本号。
  2. DELETE InnoDB 为删除的每一行保存当前系统版本号作为行的删除标识。
  3. UPDATE InnoDB 为插入一行新记录,保存当前版本号作为行的行版本号,同时保存当前系统版本号到原赖的行作为行删除标识。

保存这两个版本号的优缺点

优点:

  1. 可以使得大多数读操作可以不用加锁
  2. 可以使得数据操作变得简单,性能好,保证了只会读取到符合标准的行

缺点:

  1. 每行都需要额外的存储空间
  2. 需要做更多行检查操作
  3. 需要做一些额外的维护工作

MVCC 只在 REPEATABLE READ 和 READ COMMITED 这两个隔离级别下工作,其他两个隔离级别不兼容,READ UNCOMMITED 每次只读取最新的数据行,而不是符合当前事务版本的数据行,SERIALIZABLE 则会对所有读取的行进行加锁。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/mvcc多版本并发控制

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档