mysql 多版本并发控制
2020-04-09 本文已影响0人
黎明_dba5
转载:https://www.cnblogs.com/mengjianzhou/p/6237881.html
查看事务隔离级别
SHOW VARIABLES LIKE "%iso%"
imageMVCC
通过给每张表多加两个隐藏列来实现,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),时间对应版本
创建一个新的事务,会创建一个新的版本号
前提条件
a. InnoDB只查找版本早于当前事务版本的数据行
b. 行的删除版本要么未定义,要么大于当前事务版本
处理机制
INSERT
InnoDB为新插入的每一行保存当前系统版本号作为行版本号
DELETE
InnoDB为删除的每一行保存当前系统版本好作为删除标识
UPDATE
InnoDB为插入一行新纪录,保存当前系统的版本号,同时将当前系统版本好保存到原来行的删除标识
以更新为例:
A,B 两个事务
imageA 事务
1\. 创建A事务版本号为v1
2\. 查询时 当前行的版本号为v1
3\. 更新 先进行删除操作 版本号为v3 然后更新 行删除版本号为v3
B事务
1.创建B事务版本号为2
2\. 查询时 当前行的版本号为2
3\. 更新 先进行删除操作 版本号为v4 然后更新 行删除版本号为v4
两个事务同时更新会创建4条临时纪录
然后选择其中一条作为结果。
测试步骤
1. 创建临时表
CREATE TABLE `test1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
2. 执行事务A 中的(1)(2)
(1) START TRANSACTION;
(2) UPDATE test1 SET a=100 WHERE id=1;
(3) UPDATE test1 SET b=100 WHERE id=1;
(4) COMMIT;
3. 执行事务中的(5)(6)(7)
(5) START TRANSACTION;
(6) UPDATE test1 SET a=50 WHERE id=1;
(7) UPDATE test1 SET b=50 WHERE id=1;
(8) COMMIT;
4. 执行事务中的(3)(4)
可以在执行每一步的过过程中查看执行结果
5. 执行事务中的(8)
最终结果为 a=50 b=50
image结果正确