mysql之MVCC

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


1、概念
mvcc作用在于解决并发条件下,读写冲突的问题。一般用于RC和RR隔离级别,解决脏读和不可重复读的问题。

(1)当前读

读取的是记录的最新版本,读取时还要保证其他事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。

(2)快照读

简单的select 就是快照读,读取的是记录的可见版本, 有可能是历史数据,不加锁,不阻塞

  • Read Committed:每次select,都会生成一个快照读

  • Repeatable Read:开启事务后第一个select语句才是快照读的地方。

  • Serializable:快照读会退化为当前读。

2、MVCC的条件
要实现MVCC,需要3个条件:3个隐藏字段,undo log以及readview。

(1)隐藏字段

表结构中除了行数据以外,还有3个隐藏字段:

  • DB_TRX_ID:最新修改的事务ID,记录插入和修改最后一次的事务ID

  • DB_ROLL_PTR :回滚指针,指向上一个版本记录

  • DB_ROW_ID:隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。

(2)undo log

回滚日志,在insert update delete语句执行时保存回滚的日志。

当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即 被删除。

不同事务对同一条记录进行修改后,会生成一条版本连,下图为undo log中记录的版本链。

mysql之MVCC

(3)readview

ReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据。

readView包含四个核心字段:

  • m_ids:当前活跃的事务ID集合

  • min_trx_id:最小活跃事务ID

  • max_trx_id:预分配事务ID,当前最大事务ID+1(因为事务ID是自增的)

  • creator_trx_id:ReadView创建者的事务ID

在readview中就规定了版本链数据的访问规则:

  • trx_id == creator_trx_id:可以访问该版本 成立,说明数据是当前这个事 务更改的。

  • trx_id < min_trx_id :可以访问该版本  成立,说明数据已经提交了。

  • trx_id > max_trx_id:不可以访问该版本 成立,说明该事务是在 ReadView生成后才开启。

  • min_trx_id <= trx_id <= max_trx_id:如果trx_id不在m_ids中, 是可以访问该版本的 成立,说明数据已经提交。

不同的隔离级别,生成readview的时机不一样:

READ COMMITTED :在事务中每一次执行快照读时生成ReadView。

REPEATABLE READ:在事务第一次执行快照读的时候生成ReadView。

3、原理分析
(1)RC隔离分析

RC隔离级别是解决脏读。在事务提交之后才能读到修改后的记录。这个是怎么做到呢,以下图为例子,事务5在每次快照读的时候都会生成一个readview。
mysql之MVCC

根据undo log版本链记录和readview的匹配规则,我们来分析以下,事务5第一个查询,获取的结果是哪一个呢?
mysql之MVCC

按照上图中DB_TRX_ID为4,和事务5的第一次查询的readview进行对比,发现1,2,3,4都不匹配。

然后匹配下一条,DB_TRX_ID为3,和事务5的第一次查询的readview进行对比,发现1,2,3,4都不匹配。

然后匹配下一条,DB_TRX_ID为2,和事务5的第一次查询的readview进行对比,发现第二个是匹配的。那就说明此快照读,返回的是此版本链的数据。

事务5第二个查询,获取的结果是哪一个呢?

mysql之MVCC

按照上图中DB_TRX_ID为4,和事务5的第二次查询的readview进行对比,发现1,2,3,4都不匹配。

然后匹配下一条,DB_TRX_ID为3,和事务5的第二次查询的readview进行对比,发现第二个是匹配的。那就说明此快照读,返回的是此版本链的数据。

(1)RR隔离分析

RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。 而RR 是可 重复读,在一个事务中,执行两次相同的select语句,查询到的结果是一样的。以下图为例子,事务5在第一次快照读的时候会生成一个readview,后面就会服用此readview。上述已经分析过每次查询的记录在undo log中DB_TRX_ID为2的版本链是匹配的。

mysql之MVCC

总结:

MVCC使用隐藏字段、undo log,readview实现的,没修改一次都会在undo log中生成一个版本记录,对于同一条记录会生成一个版本链,每条记录中包含隐藏字段。而readview则是在每次快照读的时候生成,通过版本链中的trx_id字段,对比readview中的记录,通过readview的规则,判断哪条版本记录是匹配的,从而得到最终结果。所以MVCC+锁实现了事务的隔离性。

文章来源地址https://www.toymoban.com/news/detail-809947.html

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

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

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

相关文章

  • 小程序中的合法域名的作用及条件有哪些?

    小程序的合法域名是指小程序项目中使用的各种接口、资源文件等所在的域名。在小程序开发中,需要将这些域名添加到小程序后台的“开发设置”-“服务器域名”中进行配置,才能够正常使用。 合法域名的作用: 1.作为小程序请求的 API 服务器域名,包括 HTTP API、WebSocke

    2024年01月17日
    浏览(36)
  • 【Linux】线程同步 -- 条件变量 | 生产者消费者模型 | 自旋锁 |读写锁

    举一个例子: 学生去超市消费的时候,与厂家生产的时候,两者互不相冲突。 生产的过程与消费的过程 – 解耦 临时的保存产品的场所(超时) – 缓冲区 模型总结“321”原则: 3种关系:生产者和生产者(互斥),消费者和消费者(互斥),生产者和消费者(互斥[保证共享资

    2024年02月14日
    浏览(31)
  • Go 语言为什么不支持并发读写 map?

    大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。 01 介绍 在 Go 语言项目开发中,我们经常会使用哈希表 map ,它的时间复杂度是 O(1) ,Go 语言中的 map 使用开放寻址法避免哈希碰撞。 Go 语言中的 map 并非原子操作,不支持并发读写操作。 Go 官方认为 map 在大多数情况下

    2024年02月02日
    浏览(50)
  • 轻松并发,玩转StampedLock——Java 新一代读写锁

      在并发编程中,读写锁是一种常用的技术来保证数据的安全性和高效性。Java 中的 ReadWriteLock 可以让多个线程同时读取共享资源而不会出现竞争,只有在写操作时才需要独占资源。但是,如果我们想要在读操作时也可以同时写入,就需要使用 Java 8 引入的新的读写锁:St

    2024年02月03日
    浏览(34)
  • MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择

    1、问题出现     在APP客户端输入搜索文章的时,不小心输入来了一个 emoji 表情符号,提示出错了,在后台查询错误日志信息,提示查询出现了2条相同的记录: 2、业务逻辑     数据库有个 tb_search_statistic 表格用来记录用户的搜索记录。每次客户端发起搜索,后台业务

    2024年02月11日
    浏览(36)
  • StampedLock:高并发场景下一种比读写锁更快的锁

    摘要: 在读多写少的环境中,有没有一种比ReadWriteLock更快的锁呢?有,那就是JDK1.8中新增的StampedLock! 本文分享自华为云社区《【高并发】高并发场景下一种比读写锁更快的锁》,作者: 冰 河。 ReadWriteLock锁允许多个线程同时读取共享变量,但是在读取共享变量的时候,不

    2024年02月07日
    浏览(37)
  • 多线程——条件变量的概念和实现

    条件变量,也称条件锁,是利用线程间共享的全局变量进行同步的一种机制, 主要包括两个动作: 1)一个线程等待\\\"条件变量的条件成立\\\"而挂起; 2)另一个线程使\\\"条件成立\\\"(给出条件成立信号)条件的检测是在互斥锁的保护下进行的如果一个条件为假,一个线程自动阻塞

    2023年04月13日
    浏览(49)
  • 新的计算方法:预测益生菌在不同生长条件下的相互作用

    谷禾健康 益生菌可以产生有益的维生素、消化酶、必需氨基酸、免疫调节和抗菌代谢产物,从而促进人体健康,预防肠道炎症性疾病、自身免疫性疾病和胃肠道感染。其宝贵特性已得到健康行业、医疗专业人士和公众的认可。 比起单菌株益生菌, 多菌株 益生菌 在 改善 肠道

    2024年02月09日
    浏览(33)
  • 一文搞定Linux线程间通讯 / 线程同步方式-互斥锁、读写锁、自旋锁、信号量、条件变量、信号等等

    目录 线程间通讯 / 线程同步方式 锁机制 互斥锁(Mutex) 读写锁(rwlock) 自旋锁(spin) 信号量机制(Semaphore) 条件变量机制 信号(Signal) 线程间通讯 / 线程同步方式 p.s 以下有很多段落是直接引用,没有使用 markdown 的 “引用” 格式,出处均已放出。 参考 / 引用: 100as

    2024年02月10日
    浏览(35)
  • 【大数据精讲】HBase基本概念与读写流程

    目录 基本概念 概念 数据模型 Name Space命名空间 Table Row Column Time Stamp Cell 逻辑结构 json 物理存储结构 基础架构 Meta表架构 RegionServer架构 ⭐️写流程 ⭐️读流程 Apache HBase – Apache HBase™ Home \\\" This project\\\'s goal is the hosting of very large tables -- billions of rows X millions of columns --\\\" 海量数

    2024年01月24日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包