• 作者:老汪软件技巧
  • 发表时间:2024-09-15 21:02
  • 浏览量:

MySQL 的多版本并发控制(MVCC)是一种用于处理并发事务的机制,主要用于提高数据库的性能和一致性。InnoDB 是 MySQL 中最常用的存储引擎之一,它实现了 MVCC。

MVCC 的基本原理

数据版本化:在 MVCC 中,每行记录都有多个版本。每当有事务对数据进行修改时,不是直接覆盖旧的数据,而是创建一个新的版本。这些版本包含了必要的元数据信息,比如创建时间、过期时间等。

快照读:大多数 SELECT 查询都是使用快照读,这意味着查询会读取到某个时间点的一致性视图。通过这种方式,读操作不需要加锁,可以极大地提高并发性能。

当前读:对于更新操作,InnoDB 使用当前读,即总是读取最新版本的数据并对其进行加锁以避免并发问题。

隐藏列:InnoDB 表中有两个隐藏的列,用于 MVCC:

撤销日志(Undo Log) :存储之前版本的数据,以便在需要时可以执行回滚,也为快照读提供支持。

事务隔离级别:MVCC 支持多种事务隔离级别,常见的是 REPEATABLE READ。在这个级别下,事务开始时创建的快照在整个事务期间保持不变。

MVCC 快照的具体内容

事务 ID 列表

可见性规则

使用快照时,InnoDB 依据以下规则判断一个版本是否对当前事务可见:

版本链及回滚指针

MVCC 执行流程

在 MySQL 的 InnoDB 存储引擎中,事务隔离级别为 REPEATABLE READ 时,MVCC 的实现流程主要涉及如何管理并发事务的读取视图和数据版本。以下是详细流程:

1.事务启动

当一个事务以 REPEATABLE READ 隔离级别启动时,InnoDB 会创建一个一致性视图(Consistent Read View),这个视图用于确保在整个事务过程中,读操作能看到的是事务启动时刻的一致性数据状态。

2.快照读3.当前读4.版本控制5.事务提交与回滚6.幻读处理

Next-Key Locking 结合了行锁(Record Lock)和间隙锁(Gap Lock)。它不仅锁住了索引记录本身,还锁住了这些记录之间的空隙。

案例说明

假设有一个表 accounts,包含以下字段:id, name, 和 balance。

初始状态

表中有一条记录:

idnamebalance

那些年背过的题:MySQL MVCC实现原理深入分析__那些年背过的题:MySQL MVCC实现原理深入分析

Alice

1000

版本链操作过程

事务 T1 开始

事务 T2 开始并更新

旧数据版本仍然存在,形成版本链。

事务 T3 开始并提交更新

事务 T1 查询

事务 T2 提交

新事务 T4 开始并查询

总结回滚流程

在 MySQL 的 InnoDB 存储引擎中,事务回滚操作会影响版本链的状态。回滚发生时,未提交的修改将被撤销,并且对最终的数据可见性不会产生影响。这是通过撤销日志(undo log)和版本链的管理实现的。

事务回滚过程中版本链的变化场景描述

假设我们有一个表 accounts,其中包含以下记录:

idnamebalance

Alice

1000

操作步骤

事务 T1 开始

事务 T1 回滚

回滚后的结果

总结思考题:RR与RC性能对比影响性能的因素

锁争用:

应用场景: