MySQL理解MVCC
😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆 博客首页 @怒放吧德德 To记录领地
🌝分享学习心得,欢迎指正,大家一起学习成长!
转发请携带作者信息 @怒放吧德德 @一个有梦有戏的人
文章目录
转发请携带作者信息 @怒放吧德德 @一个有梦有戏的人
简介
多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种常用于数据库管理系统的并发控制方法,MySQL数据库中的InnoDB存储引擎就实现了这种技术。MVCC通过在每个事务中对数据进行版本控制来实现多个事务的高效并发执行,增强了数据库的读写性能,并且减少了锁的需求。
理解MVCC
在MySQL的可重复读的隔离级别中,同样的SQL查询语句在同一个事务中,查出来的数据是一致的,其他事务对这些数据进行修改,当前事务是不可见的。
这个隔离级别就是由MVCC机制来实现的。对一行数据并不会通过对读和写加互斥锁来保证隔离性,避免了频繁加锁互斥,而串行化隔离级别是通过读写互斥实现。
MySQL中读以提交和可重复读隔离级别都是通过MVCC。
undo日志版本链
undo日志版本链是指一行数据被多个事务依次修改后,为了保持数据修改之前版本的可访问性,InnoDB不会直接覆盖旧数据。会将数据的旧版本保存到undo日志中,并且用隐藏字段trx_id(事务id)和roll_pointer(回滚指针)将这些日志串联起来成为一组历史版本链。
这个undo日志不只是保存单个版本,而是随着时间推移和更多事务的执行,可能保存同一数据项的多个历史版本。这些历史版本形成一个链条,称为版本链。当需要某个记录的历史状态时,可以通过回滚undo日志中的操作来获取旧版本数据,或者在不同隔离级别的读取事务中适当地提供旧数据,以此来保证一致性读取。
如下图,可以很好的理解什么是undo日志版本链
如上图,我们在插入数据的时候,会开启事务,所以会带着一个事务id,接着对这条数据进行修改,MySQL也会将修改的数据加上事务id以及回滚指针(roll_pointer),并且由这个回滚指针来指向上一个事务的旧数据版本,这样就构成了日志版本链。
read-view机制
read-view机制是InnoDB存储引擎实现MVCC的一种来创建一致性读取视图的技术。主要作用是用来确保可重复读和读已提交的隔离级别下,事务能够读到一致的数据快照,即使其他事务在对数据进行修改。
当一个事务想要执行一致性读取操作时候,InnoDB通过多版本并发控制(MVCC)来保存数据的多