Mysql MVCC实现

这篇具有很好参考价值的文章主要介绍了Mysql MVCC实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

并发事务可能产生的问题:

  • 读+读,并发读不会有问题
  • 读+写,并发读写可能会发生脏读、不可重复读、幻读
  • 写+写,并发修改同一行数据,可能产生数据丢失(会滚丢失、覆盖丢失)等问题

MVCC定义

MVCC(Mutil Version Concurrency Control)多版本并发控制,是一种并发访问的机制(非具体实现),广泛应用于数据库管理系统,比如Mysql、Oracle、Postgresql等,实现对数据库的并发访问。本质就是一行数据具有多个不同版本的记录。

Mysql的InnoDB引擎实现了MVCC机制,用来处理读写冲突,做到非阻塞并发读,提升并发效率。

快照读和当前读

当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

  • select lock in share mode(共享锁) 读读不冲突、读写、写写冲突
  • select for update ; update, insert ,delete(排他锁) 读读、读写、写写冲突

快照读

顾名思义,就是读取undo log中的某一版本的快照,读到的数据可能不是最新的,但是可以不加锁就可以读到数据

  • 读读不冲突、读写不冲突
  • 写写冲突

MVCC实现原理

MVCC的目的就是多版本并发控制,在数据库的实现,就是为了解决读写冲突,它的实现原理主要依赖记录中的3个隐式字段,undolog,Read View来实现的。

隐式字段

每行记录除了我们自定义的字段之外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段

  • BD_TRX_ID: 6byte,最近修改(修改/插入)的事务ID:记录创建该记录/最后一次修改该记录的事务ID
  • DB_ROLL_PTR: 7byte,回滚指针,指向这条记录的上一个版本(存储在rollback segment里)
  • DB_ROW_ID: 6byte,隐含自增ID,如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引

Mysql MVCC实现

undo log

在修改数据的时候,会向 redo log 中记录修改的页内容(为了在数据库宕机重启后恢复对数据库的操作),也会向 undo log记录数据原来的快照(用于回滚事务)。undo log有两个作用,除了用于回滚事务,还用于实现MVCC

  • insert log:代表事务在 insert 新记录时产生的 undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
  • update undo log:事务在进行 update 或 delete 时产生的 undo log ; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被 purge 线程统一清除

版本链

1.插入一条记录

Mysql MVCC实现

2.修改记录

Mysql MVCC实现

  1. 加锁
  2. copy到undo log,作为旧记录(当前行的copy副本)
  3. 修改age,trx_id(从1开始递增);回滚指针指向副本
  4. 提交事务,释放锁
3.修改记录

Mysql MVCC实现

  1. 加锁
  2. copy到undo log,作为旧记录(当前行的copy副本),已经有undo log,此副本作为链表表头插入的undo log的头节点
  3. 修改age,trx_id(从1开始递增);回滚指针指向副本
  4. 提交事务,释放锁

Read View读视图

Read View是在对数据进行快照读时,会产生的一个”一致性读视图“。

属性:

  • m_ids:活跃事务id列表,当前系统中所有活跃的(也就是没提交的)事务的事务id列表。
  • min_trx_id:m_ids 中最小的事务id。
  • max_trx_id:生成 ReadView 时,系统应该分配给下一个事务的id(注意不是 m_ids 中最大的事务id),也就是m_ids 中的最大事务id + 1 。
  • creator_trx_id:生成该 ReadView 的事务的事务id。

这些属性组成了当前事务的一致性视图(Read View),而数据版本的可见性规则,就是基于数据的 row trx_id 和这个一致性视图的对比结果得到的。

Read View可见性算法

把数据的最新记录中的 DB_TRX_ID取出来,与Read View对比,如果不符合可见性,那就通过undo log 取下一个版本对比,直到找到满足可见性的版本数据。
Mysql MVCC实现

  • 当【版本链中记录的 trx_id 等于当前事务id(trx_id = creator_trx_id)】时,说明版本链中的这个版本是当前事务修改的,所以该快照记录对当前事务可见。
  • 当【版本链中记录的 trx_id 小于活跃事务的最小id(trx_id < min_trx_id)】时,说明版本链中的这条记录已经提交了,所以该快照记录对当前事务可见。
  • 当【版本链中记录的 trx_id 大于下一个要分配的事务id(trx_id > max_trx_id)】时,该快照记录对当前事务不可见。
  • 当【版本链中记录的 trx_id 大于等于最小活跃事务id】且【版本链中记录的trx_id小于下一个要分配的事务id】(min_trx_id<= trx_id < max_trx_id)时,
    • 如果trx_id m_ids中,说明生成 ReadView 时,修改记录的事务还没提交,所以该快照记录对当前事务不可见;
    • 如果trx_id不在m_ids中,说明生成该版本的事务已经提交,对当前事务可见

隔离级别

  • 读未提交(READ UNCOMMITTED)
  • 读已提交(READ COMMITTED)
  • 可重复读(REPEATABLE READ)
  • 串行化(SERIALIZABLE)

mvcc只在读已提交和可重复读两种隔离级别生效文章来源地址https://www.toymoban.com/news/detail-422663.html

  • 读已提交
    • 事务开启后,每次select都会生成一个Read View,可以读到别的事务已经提交的数据
  • 可重复读
    • 事务开启后,只在第一次select时生成Read View,之后的select都基于此视图做可见性判断。

长事务

为什么要避免长事务

  • 长事务可能存在很老的Read View,如下图的事务1和2,这些视图很可能访问任何数据,在这个事务提交前,它可能用到的回滚记录都不能清理,需要保留,占用大量存在空间
  • 长事务占用锁资源,长时间不释放锁,可能拖垮整个库
    Mysql MVCC实现

到了这里,关于Mysql MVCC实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL高阶知识点(一)事务的并发问题和隔离级别

    简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 在 MySQL 中,事务支持是在 引擎层 实现的。 MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。 如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。

    2024年02月12日
    浏览(23)
  • MySQL 多版本并发控制 MVCC

    事务的4个隔离级别以及对应的三种异常 读未提交( Read uncommitted ) 读已提交( Read committed ):脏读 可重复读( Repeatable read ):不可重复读 串行化( Serializable ):幻读 脏读:一个事务读取到了另外一个事务没有提交的数据; 不可重复读:在同一个事务中,两次读取同一

    2024年01月18日
    浏览(34)
  • Mysql进阶-InnoDB引擎事务原理及MVCC

    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。  事务的四大特性: 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败

    2024年02月04日
    浏览(26)
  • 从 MySQL 的事务 到 锁机制 再到 MVCC

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、事务 1.1 含义 1.2 ACID 二、锁机制 2.1 锁分类 2.2 隔离级别 三、MVCC 3.1 介绍 3.2 隔离级别 3.3 原理 四、总结 转眼又一年~~2023马上就要到尾声了,在最后的几天中

    2024年02月03日
    浏览(25)
  • MySQL的多版本并发控制(MVCC)

    MVCC MVCC,是Multiversion Concurrency Control的缩写,翻译过来是多版本并发控制,和数据库锁样,他也是一种并发控制的解决方案 我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下 旦三种情况:读-读并发,读-写并发,写-写并发 我

    2024年01月18日
    浏览(34)
  • 【Mysql】MVCC版本机制的多并发

    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘 。 🛸 Mysql专栏 : Mysql内功修炼基地 家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我

    2024年02月11日
    浏览(28)
  • MySQL多版本并发控制mvcc原理浅析

    1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control),多版本并发控制,是一种数据库的并发控制机制。它用于管理事务并发执行时对数据的访问和修改,保证在多个事务同时对数据库进行读写操作,不会出现数据不一致或丢失的情况 1.2mvcc解决的问题 当多个事务同时访问数据

    2024年04月25日
    浏览(25)
  • 一文带你了解MySQL之事务隔离级别和MVCC

    为了我们学习的顺利进行,我们这边创建一张 hero 表 这里需要注意的是,我们的 hero 表的主键是 number ,而不是 id ,主要是后边要用到的 事务id 做一下区别,然后我们给这个表里插入一条数据 现在我们表里的数据就是这样: 我们知道 MySQL 是 CS 架构的软件,若干个客户端与

    2024年02月08日
    浏览(56)
  • 【MySQL高级篇笔记-多版本并发控制MVCC(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一、什么是MVCC 二、快照读与当前读 1、快照读  2、当前读 三、复习 1、再谈隔离级别 2、隐藏字段、Undo Log版本链 四、MVCC实现原理之ReadView  1、什么是ReadView  2、设计思路 3、ReadView的规则 4、MVCC整体操作流程 五、举例说明 1、READ

    2024年02月08日
    浏览(50)
  • MySQL事务(4种事务隔离级别、脏写、脏读、不可重复读、幻读、当前读、快照读、MVCC、事务指标监控)

    显示事务: read write:读写事务,默认模式,表示当前事务可以读写数据。 read only:只读事务,很少用,表示当前事务不能修改数据。 with consistent snapshot:一致性快照,在数据库事务中确保事务在执行过程中能看到一个事务开始时的一致数据库状态,避免被其他并发操作影响

    2024年03月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包