MySql教程

MySQL的MVCC机制详解

本文主要是介绍MySQL的MVCC机制详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、原理简单说明

MySQL底层还有几个隐藏字段,比如类似创建事务id、删除事务id

idname balance 创建事务id删除事务id
1zhangsan4501013
2wangwu60011
2wangwu88860013
先查询select * from account;
ps-注意:这个时候创建了查询快照,记录执行sql这一刻最大的已提交事务id(快照点已提交最大事务id)

比如现在开启事务,事务id为13,
①、先删除id=1的记录
②、然后更新id=2的记录,
③、再提交对于删除操作。
      mysql底层会记录好被删除的数据行的删除事务id,
      对于更新操作 mysql底层会新增一行相同数据并记录好对应的创建事务id
      在id为12的事务里执行查询操作mysql底层会带上过滤条件,创建事务id <= max(当前事务id(12),快照点已提交最大事务id),删除事务id> max(当前事务id(12),快照点已提交最大事务id)

通俗的讲:对于上表中的数据是这么来的。
①开始事务,插入了name为zhangsan的数据,事务id为10,此时就会记录创建事务id为10,提交事务
②开始事务,插入了name为wangwu的数据,事务id为11,此时就会记录创建事务id为11,提交事务
③开始事务,更新wangwu这条记录为wangwu666。MySQL底层实际上并不是直接修改了最终数据,而是会生成一条新的记录(PS:这里生成新的记录并不是指真的在我们的数据表里面插入一条记录,而是mysql自己维护的,每更新一次就会有一条新数据)。新数据的id和原来数据的id是一样的,也会有一个创建事务的id,此时事务的id为13,所以记录的为13。
接着在该事物中删除name为zhangsan的数据,这个时候就记录删除事务id为13

注意:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB 表的语句,事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的

这篇关于MySQL的MVCC机制详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!