八股

mysql mvcc
mvcc允许多个事务同时读取同一行数据。做到了读读并行,读写并行。它是通过read view实现的,可看做是数据库的一个快照版本。
read view有几个重要参数:
m_ids:创建read view 时当前数据库活跃事务的id列表。(启动了还未提交的事务)
min_trx_id:创建read view时活跃事务的最小id值
max_trx_id:创建readview时数据库要分配给下一个事务的id,即m_ids中最大值+1
creator_trx_id:创建该read view的事务id
innodb聚集索引记录中会有两个隐藏列:
trx_id:一个事务对某条聚集索引记录改动时,会把该事务的id记录在这里
roll_pointer:每次改动时会把记录写到undo日志中,本列存的是指向旧版本记录的指针。

如下图,当隐藏列trx_id的值小于read view的min_trx_id,说明这个版本的数据是在readview创建之前就提交了,因此该版本的记录对当时事务可见。当大于max_trx_id时说明这个版本的记录是在readview创建后事务才提交的,因此对当前事务不可见
如果再min和max之间,需要判断trx_id在不在m_ids中,如果在且当trx_id等于readview的creator_id时可见,因为是当前事务创建的。如果在且不想等,说明生成该版本的事务还活跃着并且不是当前事务创建的,该版本记录对当前事务不可见。如果不在m_ids中说明生成该版本的事务已经提交,该版本记录对当前事务可见。
全部评论

相关推荐

06-26 17:08
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务