mysql性能调优09_mvcc多版本并发控制机制概述过程详解

所得皆惊喜 所得皆惊喜     2022-12-21     208

关键词:

①. 环境准备

②. MVCC概述

  • ①. Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。

  • ②. 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的

  • ③. Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制

②. undo日志版本链与read view机制详解

  • ①. undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链(见下图)

  • ②. 在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果

  • ③. 版本链比对规则:

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的
  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的)
  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的)
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见
  • ④. 对于删除的情况可以认为是update的特殊情况,会将版本链上最新的数据复制一份,然后将trx_id修改成删除操作的trx_id,同时在该条记录的头信息(record header)里的(deleted_flag)标记位写上true,来表示当前记录已经被删除,在查询时按照上面的规则查到对应的记录如果delete_flag标记位为true,意味着记录已被删除,则不返回数据

  • ⑤. 注意:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB表的语句,事务才真正启动,才会向mysql申请事务id,mysql内部是严格按照事务的启动顺序来分配事务id的。

  • ⑥. MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据

mysql中的多版本并发控制(mvcc)(代码片段)

...文统一用MVCC代替)时,看的一头雾水,尤其是《高性能MySQL》一书中对于MVCC的讲解,言语过于简略,遂通过查阅多方资料,才算大致搞懂MVCC。本文就笔者个人对于MVCC的理解进行一下比较白话文的介绍࿰ 查看详情

mysql----mvcc(代码片段)

...式来解决读写冲突,提高数据库高并发场景下的吞吐性能,也就是说读写、写读这两个操作可以并行,提高了InnoDB的并发度。在内部实现中,InnoDB通过undolog保存每条数据的多个版本,并且能够找回数据的历史... 查看详情

mysql-innodb-mvcc多版本并发控制(代码片段)

文章目录MySQL-InnoDB-MVCC多版本并发控制为什么需要有MVCC?什么是当前读和快照读?快照读当前读MVCC的实现原理三个隐藏的字段UndoLog记录链图解ReadView读视图MVCC的整体流程RR级别下和RC级别下ReadView生成的时机总结本文简单总结... 查看详情

《mysql高级篇》十四多版本并发控制(代码片段)

...当前读MVCC在MySQLInnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读 查看详情

深入剖析mysql事务和spring事务(代码片段)

...事务失效的场景。分享内容Mysql事务隔离机制锁机制MVCC多版本并发控制隔离机制Spring事务应用和源码分析事务失效问题一、Mysql事务数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机... 查看详情

mysql-innodb-mvcc多版本并发控制(代码片段)

一、MySQL可重复读级别下,因为MVCC引起的BUG,下图1为相应的Java代码,其中事务1的生命周期最长,循环开启的事务2、3、4。。。与事务1存在并发问题                                  ... 查看详情

mysqlmvcc多版本并发控制(重点:mvcc实现原理之readview)(代码片段)

...当前读MVCC在MySQLInnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做 查看详情

mysql锁--05---mvcc-多版本并发控制

...:MVCC,全称Multi-VersionConcurrencyControl,即==多版本并发控制==快照读和当前读1.快照读:-mvcc快照读可能读到的并不一定是数据的最新版本,而有可能是之前的==历史版本==普通的select…查... 查看详情

mysql----mvcc(代码片段)

MVCC一、前置知识1、undolog版本链2、ReadView二、RC基于ReadView的实现三、RR基于ReadView的实现四、MVCC能否完全解决幻读?五、小结MySQL中多个事务并发执行的隔离性是靠MySQL的锁机制实现的,但是写锁和读锁是冲突的,为... 查看详情

一文讲清,mysql如何解决多事务并发问题

...不会发生。它是怎么做到的呢?这就是由经典的MVCC多版本并发控制机制做到的,MVCC的实现,又是基于undolog版本链的。前面讲MySQL一行数据的存储格式,讲到了每行数据有两个隐藏的字段&# 查看详情

postgres多版本控制

...有可能产生不一致,所以出现了在高并发情况下如何保持性能又保持一致出现了MVCC,多版本并发实现MVCC的方法有两种:1)写数据时,将旧数据移到一个单独的地方,比如回滚段中,从回滚段把旧数据读回来2)写数据时,旧数... 查看详情

1.4多版本并发控制(代码片段)

多版本并发控制(Multi-VersionConcurrencyControl,MVCC)是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,无需使用MVCC。可串行化隔离级别需... 查看详情

对mysql的mvcc多版本控制的通俗理解(代码片段)

概述mvcc(Multi-VersionConcurrencyControl):多版本并发控制。概括的说就是过去的可见,现在正在进行中的不可见,未来的不可见。实现原理概述mysql的表结构除了我们自定义的列外,还有一些隐藏列:DB_TRX... 查看详情

对mysql的mvcc多版本控制的通俗理解(代码片段)

概述mvcc(Multi-VersionConcurrencyControl):多版本并发控制。概括的说就是过去的可见,现在正在进行中的不可见,未来的不可见。实现原理概述mysql的表结构除了我们自定义的列外,还有一些隐藏列:DB_TRX... 查看详情

mvcc(多版本并发控制)详解

...擎下,RC、RR基于MVCC进行并发事务控制,MVCC是基于“数据版本”对并发事务进行访问用一个例子来解释一下,下面是一张事务执行流程图:稍微解释一下:事务A将id=1088的记录的name改为“张三”,并提交事务B将id=10 查看详情

mysql事务与锁

...并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事梦里不知身是客,一晌贪欢。 查看详情

mvcc多版本并发控制

...的问题?所以来详细研究一下:MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读 查看详情

深入了解mysql的隔离级别和锁机制

...问题,为了解决多事务并发问题,MySQL设计了锁机制、MVCC多版本并发控制隔离机制、以及事务隔离机制,用一整套机制来解决多事务并发所出现的问题.1.事务的四大特性特性特点Atomicity(原子 查看详情