MVCC机制底层是基于快照实现的,每条新增、修改、删除操作都会记录一份快照(包含每次操作的事务id)。
例如:表名称 s_score
id name score
1 张三 50
2 李四 60
3 王五 70
底层实现
id name score 创建事务id 删除事务id
1 张三 50 10 空
2 李四 60 11 空
3 王五 70 13 空
开启两个连接会话同时连接
1.第一个会话 事务id 13
1.1 select * from s_score ; 因为不新增和修改、删除不记录在底层实现中
结果:
id name score
1 张三 50
2 李四 60
3 王五 70
1.2 删除id 为1 的数据 delete from s_score where id = 1; 由于是删除操作所以底层实现会变 13
会话1事务提交
底层
id name score 创建事务id 删除事务id
1 张三 50 10 13
2 李四 60 11 空
3 王五 70 13 空
2.第二个会话 事务id 14
2.1 select * from s_score ;
结果:
id name score
1 张三 50
2 李四 60
3 王五 70
2.2修改id 为2的 成绩为55
update s_score set score = 55 where id =2;
id name score 创建事务id 删除事务id
1 张三 50 10 13
2 李四 60 11 14
3 王五 70 13 空
4 李四 55 14 空
1.对于删除操作,mysql底层会记录好被删除的数据行的删除事务id,对于更新操作
mysql底层会新增一行相同数据并记录好对应的创建事务id
2.在id为12的事务里执行查询操作mysql底层会带上过滤条件,创建事务id <=
max(当前事务id(12),快照点已提交最大事务id),删除事务id> max(当前事
务id(12),快照点已提交最大事务id)