Mysql MVCC原理

mysql MVCC原理


一、什么是MVCC

MVCC的全称是multi-version concurrency control 就是多版本并发控制,是mysql InnoDB引擎的一种提升并发性能的一种机制。MVCC的主要特性:

  • **应对高并发事务, MVCC比单纯的加锁更高效;
  • MVCC只在 READ COMMITTEDREPEATABLE READ 两个隔离级别下工作;
  • 解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题
    它保留有关已更改行的旧版本的信息,以支持诸如并发和回滚之类的事务功能 。此信息以称为回滚段的数据结构存储在表空间中 (在Oracle中类似的数据结构之后)。InnoDB 使用回滚段中的信息来执行事务回滚中所需的撤消操作。它还使用该信息来构建行的早期版本,以实现 一致的读取。

二、MVCC具体实现原理

网上有很多版本的说法,简直是误人子弟,我这里以官方文档为准,给大家做一个简单地原理介绍。mysql多版本控制官方文档
官方文档截图
我们从上图中可以看到,innodb在数据库中每一行增加了三个字段。注意,是三个字段,分别是

  • DB_TRX_ID: 6-byte 指示插入或更新该行的最后一个事务的事务标识符。此外,删除在内部被视为更新,在该更新中,该行中的特殊位被设置为将其标记为已删除。
  • DB_ROLL_PTR: 7-byte 也被叫做roll pointer,回滚指针指向写入回滚段的undo log记录。如果行已更新,则undo log记录将包含在更新行之前重建行内容所必需的信息。
  • DB_ROW_ID :6-byte 包含一个行ID,该ID在插入新行时会单调增加。如果 InnoDB自动生成聚集索引,该索引包含行ID值。否则,该 DB_ROW_ID列不会出现在任何索引中。

回滚段中的undo log分为插入和更新undo log。插入undo log仅在事务回滚时才需要,并且在事务提交后可以立即将其丢弃。更新undo log也用于一致的读取中,但是只有在不存在为其InnoDB分配了快照的事务( 一致的读取可能需要更新undo log中的信息来构建数据库的早期版本)后,才可以将行删除。
在InnoDB中,当使用SQL语句删除行时,并不会立即将其从数据库中物理删除。InnoDB仅在丢弃为删除而编写的更新撤消日志记录时,才物理删除相应的行及其索引记录。此删除操作称为purge,它非常快,通常花费与执行删除操作的SQL语句相同的时间。

总结

这里仅仅是对mysql mvcc并发控制的原理进行了简单地分析
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值