

MVCC的快照机制可以简化成时间点+查询的模型来理解。
查询的功能是:根据时间点,查询到指定时间点之前的数据,而不会看到该时间点之后的变更(提交)。
事务的四个隔离级别中,与快照有关的有两个:RC(Read Committed)和RR(Repeatable Read)。

图中需要注意的点:
图中查出的数据:
实验环境:MySQL 9.2.0
虽然我使用的MySQL版本较高,但下面给出的sql脚本在MySQL 8.0以上都可以正常使用
-- 查询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;
-- 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脚本按照脚本行数依次执行即可还原实验效果。
需要分3个SESSION(窗口)进行操作。
SESSION1(窗口1)
-- 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)
-- SESSION2
set @@autocommit=0; -- 关闭自动提交
START TRANSACTION; -- 开启事务
UPDATEuserSET salary =1500WHERE id =1; -- 更新id为1的用户的薪水为1500
COMMIT;SESSION3(窗口3)
-- SESSION3
set @@autocommit=0; -- 关闭自动提交
START TRANSACTION; -- 开启事务
UPDATEuserSET salary =2000WHERE id =1; -- 更新id为1的用户的薪水为1500
COMMIT;