mysql mvcc 实现原理

0 概述

mvcc(multiversion concurrency control )多版本并发控制;用于多事务环境下,对数据读写在不加读写锁的情况下实现互不干扰,从而实现数据库的隔离性。

1 事务特性

事务四种特性如下图所示:undo log是回滚日志,提供回滚操作。
在这里插入图片描述

2 mvcc 实现原理

mvcc 在mysql Innodb 得到支持,Innodb为每行记录都增加了三个字段。在这里插入图片描述

  • DB_TRX_ID,占用6个字节,记录插入或更新该行的最后一个事务的事务 ID
  • DB_ROLL_PTR ,占用7个字节,指向改行对应的 undo log 的指针
  • DB_ROW_ID ,占用6个字节,AUTO_INCREMENT 的主键 ID。如果InnoDB自动生成聚集索引,则该索引包含行ID值。否则,DB_ROW_ID列不会出现在任何索引中。

当前活跃的事务链表 (执行begin,但是还没有commit的事务)保存到一个叫trx_sys的事务链表中,当事务提交成功后,事务链表就会移除该事务。

在这里插入图片描述

当前事务能读取到哪个历史版本?

Read View是一个事务开启时,会根据上面的事务链表构造出来的。事务链接,这个数据结构中存储了当前Read View中最大的ID及最小的ID。当前事务可以根据查询到事务链表事务ID进行匹配是否能看见该记录,从而实现数据库的事务隔离。

  • 如果trans_id<low_limit_id 表名这个版本是已经提交事务生成的,所以是可见的。
  • 如果trans_id>low_up_id 表名这个版本由将来未开始事务生成,所以是不可见的。
    -low_up_id< trans_id<up_limit_id 如果row 事务id 在事务链表中,不可见。 如果row 事务id 不在事务链表中,可见

在这里插入图片描述

参考文献
[1]https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
[2]https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_mvcc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值