MySQL的MVCC底层原理
这是一个account表 有id和name字段
MySQL底层会给表添加2个字段 一个是trx id(事务id) 一个是roll pointer(回滚指针)
事务id
假设一个事务id为60的事务 往表中插入一条数据 那么这条数据的trx id为当前事务的id 60
注:执行更删改的操作才会生成事务id
接下来详细说下这个时序图(有先后顺序的)
第一个事务
开启事务 做一个更新test表的操作 做更新的目的是为了生成一个事务id 假设为100
第二个事务
开启事务 做一个更新test表的操作 做更新的目的是为了生成一个事务id 假设为200
第三个事务
开启事务 做一个更新account表的操作 update accout set name='平凡人笔记' where id = 1 生成一个事务id 假设为300
先在MySQL表中插入一条记录 同时把之前的那条记录放到undo log日志(回滚日志)中 新数据中的roll pointer(回滚指针要指向老的那条数据)
执行时序图中第9步
MySQL在第一次执行查询语句的时候 select name from account where id =1 会生成一致性视图 叫 read-view(快照视图) 这里面是当前发起的这个查询的时候所有未提交的事务id数组 以及截止目前已创建(包含已提交和未提交)的最大的事务id
根据生成的readview去版本链中 从最新的记录 按照一定的规则逐步去找应该显示出来的记录
图8中的查询这一步骤(对应时序图中的第9步)查询结果
事务id=100的这个事务未提交 事务id=200的这个事务未提交 事务id=300的这个事务 (update accout set name='平凡人笔记' where id = 1) 提交了 那么结果就是 “平凡人笔记”了
接着看时序图第10
update account set name='平' where id =1;
插入一条name为"平"的数据 事务id为100
时序图11
update account set name='凡' where id =1;