首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL MVCC快照机制的简易模型

MySQL MVCC快照机制的简易模型

作者头像
黑猫Lien
发布2026-06-17 21:23:45
发布2026-06-17 21:23:45
1270
举报

时间点+查询模型

MVCC的快照机制可以简化成时间点+查询的模型来理解。

查询的功能是:根据时间点,查询到指定时间点之前的数据,而不会看到该时间点之后的变更(提交)。

事务的四个隔离级别中,与快照有关的有两个:RC(Read Committed)和RR(Repeatable Read)。

  • • RC级别下:每次快照读创建一个快照(时间点)。
  • • RR级别下:第一次查询创建快照(时间点)。

图中需要注意的点:

  • • 时间点是以commit为分界的,也就是说,每个commit会出现一个新的数据版本。
  • • 图中部分内容经过适当简化,以便于理解。

图中查出的数据:

  • • RR模式下,始终读取到id为1的用户的薪资(salary)为1000,数据一致。
  • • RC模式下,每次读取的薪资(salary)都不同,从上到下分别为1000,1500,2000。

实验记录

实验环境:MySQL 9.2.0

虽然我使用的MySQL版本较高,但下面给出的sql脚本在MySQL 8.0以上都可以正常使用

实验中可能用到的语句
代码语言:javascript
复制
-- 查询MySQL版本
SELECT version();

-- 查询是否自动提交(0:关闭 1:开启)
-- 解释:自动提交相当于每条语句执行后自动提交了,就看不出事务过程中的状态了,所以要关闭才能看出实验效果
select @@autocommit;
-- 关闭自动提交
set @@autocommit=0;


-- 查询当前session的隔离级别
SELECT @@transaction_isolation;

-- 修改当前session隔离级别为:READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 修改当前session隔离级别为:READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 修改当前session隔离级别为:REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 修改当前session隔离级别为:- SERIALIZABLE
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 
初始化表与数据
代码语言:javascript
复制
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

INSERT INTO `user` (`id`, `name`, `salary`) VALUES (1, 'Lien', 1000.00);
SQL脚本

本脚本是实现上面图中的场景的实验案例。

多个窗口的交互顺序已经排好了,SQL脚本按照脚本行数依次执行即可还原实验效果。

需要分3个SESSION(窗口)进行操作。

SESSION1(窗口1)

代码语言:javascript
复制
-- SESSION1
set @@autocommit=0; -- 关闭自动提交
-- 设置隔离级别(以下两条语句,选择一条执行)。不同的隔离级别有不同的效果
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- RC级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- RR级别

START TRANSACTION; -- 开启事务

SELECT salary FROMuserwhere id =1; -- RR:1000 RC:1000




SELECT salary FROMuserwhere id =1; -- RR:1000 RC:1500

SELECT salary FROMuserwhere id =1; -- RR:1000 RC:2000
COMMIT;

SESSION2(窗口2)

代码语言:javascript
复制
-- SESSION2
set @@autocommit=0; -- 关闭自动提交





START TRANSACTION; -- 开启事务

UPDATEuserSET salary =1500WHERE id =1; -- 更新id为1的用户的薪水为1500
COMMIT;

SESSION3(窗口3)

代码语言:javascript
复制
-- SESSION3
set @@autocommit=0; -- 关闭自动提交









START TRANSACTION; -- 开启事务
UPDATEuserSET salary =2000WHERE id =1; -- 更新id为1的用户的薪水为1500

COMMIT;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑猫的软件设计坞 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 时间点+查询模型
  • 实验记录
    • 实验中可能用到的语句
    • 初始化表与数据
    • SQL脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档