码迷,mamicode.com
首页 > 数据库 > 详细

图说Mysql的MVCC原理

时间:2021-02-25 12:10:17      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:管理系统   segment   控制   顺序   并发   一个   rdb   byte   系统   

一.什么是MVCC

  MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
  MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
 

二.一个小Demo

  下面我们来看一个小demo,我这里新建来一张表mvcc_test,表字段有id和num。这里插入一笔数据 id=1 num=12

  现在我们假设有3个事务,按以下顺序执行(如下图):

  1. 开启事务A
  2. 开启事务B
  3. 执行事务A查询
  4. 执行事务B查询
  5. 执行事务C
  6. 执行事务B更新
  7. 执行事务B查询
  8. 执行事务A查询并commit
  9. 执行事务Bcommit

   那么请问步骤7和8执行的结果的num分别是多少?

 技术图片

   答案是:14和12

  我们伟大的小平同志曾经说过:“实践是检验真理的唯一标准”,这里我们实际来操作一下试试!!! 
  我用navicat分别建来三个查询
事务A:                                                                                                                                
   技术图片 
事务B:
  技术图片
事务C: 
技术图片
 

    下面我们按照操作步骤执行

   步骤1 ——开启事务A

   技术图片

   步骤2——开启事务B

       技术图片

    步骤3——执行查询A

   技术图片

    步骤4——执行查询B

         技术图片

      步骤5——执行事务C

         技术图片

      步骤6——执行事务B更新

        技术图片

    步骤7——执行事务B查询

   技术图片

    步骤8——执行事务A查询并commit

    技术图片

    很神奇对吧,下面我们就谈谈它的原理。   

  

 三.图说原理

  首先了解MVCC里面2个重要概念

  快照读和当前读

     快照读:像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;

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

  InnerDB的事务管理

    事务ID和顺序递增

   

   在mysql的每一行数据中有3个隐藏字段

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

 

  假设我们现在表中数据id=1的事务id=100

    技术图片

   在执行步骤1和2之后,由于事务的顺序递增特性,事务A的事务id=101,事务B的id=102

   在执行步骤3的时候因为是查询,所以会生成一个num=12的快照,进行快照读,步骤4同理

   在执行步骤5时候,因为是更新操作,进行当前读,事务C会创建一个新事务,事务id=103,并修改当前最新版本DB_TRX_ID=103,num变成13

       技术图片

   此时执行步骤6,进行当前读,事务B读取读DB_TRX_ID不是100,而是103,读取到num为13进行更新操作,num变成14

  技术图片

   执行步骤7查询,进行快照读还是事务A开启时候读快照所以num结果还是12。

   执行步骤8查询,因为在事务B中我们进行最后的更新操作,所以可以返回最新的num值14。

 

图说Mysql的MVCC原理

标签:管理系统   segment   控制   顺序   并发   一个   rdb   byte   系统   

原文地址:https://www.cnblogs.com/shawn-sun/p/14444258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!