zoukankan      html  css  js  c++  java
  • mysql mvcc 的理解

    mvcc 全称 multiple version concurrency control 多版本并发控制,是数据库领域比较常用的一种非锁并发技术。

    mysql 的innodb中,在RR、RC级别会使用mvcc来提升并发。

    实现原理:

      首先理解几个基本知识点。

    一、mysql在行都设置了默认列(对查询不可见),包含有 data_trx_id、data_roll_ptr、db_row_id、delete bit

    • db_row_id是在用户没设置聚集索引保留
    • delete bit 删除标志
    • data_trx_id 最近更新或创建 这条记录的 事务id
    • data_roll_ptr 回滚指针(也称之为删除事务id,在事务中查找查找上个版本的记录就靠这个指针,指向了undo log的地址,可以把同一个事务中的多个版本理解为链式关系)

    二、Read View:RR、RC级别,开启事务时,每个事务各自都会维护一份Read View,ReadView 中包含了当前DBMS中活跃的事务id列表(即begin开启了,但未commit的事务),后续简称RV。

    三、事务select的检索的规则:

    1. 查找比当前事务id小的trx_id,这样能够保证查询出当前事务开启前已经写入或提交的数据。
    2. 查找行删除事务Id未设置或者删除事务Id值大于当前事务Id,这样能保证,当前事务开启后被删除的数据对当前事务是可见的。
    3. 匹配Read View 列表(因为前两条并能不保证mvcc的正确性,见下文举例)
      • 比较RV中max(trx_id) 和 min(trx_id) 
        • 如果current_trx_id < min(trx_id) 说明要访问的版本早已经提交,对当前事务来说数据都是可见的  
        • 如果min<current_trx_id<max 说明当前事务可能正处于活动事务列表中,查找列表如果事务还存在,那么版本不可见从该行的roll_ptr指向的行获取值,如果不在列表说明事务已经提交了,数据可见。
        • 如果current_trx_id >max 说明当前事务是在RV副本生成之后产生的,更新的数据应该不可见,从该行的roll_ptr指向的行获取值。

    看下具体过程:

    当事务级别为默认级别RR时:

    假设 有张表

    test(bl varchar(20),id not null primary key)

     有事务 A、B、C、D  分两个场景来看 RV的关系。

    场景1:

      RR级别时候,RV不会更新,一直保持开启事务时候生产的RV,RV=[1]当前数据不可用,需要查询历史版本,发现roll_ptr为空,无历史版本,古返回为空。

      RC级别时候,每次查询RV会生成新的列表,最终RV为空,故直接返回行数据即可。

    场景2 ,表初始数据是 "小明"
      RR级别时也是一样,会一直持有同一张RV,RV=[1,2] ,会认为1,2 版本均不可用户,会寻找1,2版本的历史版本,返回值是 小明

      RC级别的时候,RV会一直更新,RV=[2]会查找2的历史版本 trx_id=1的提交记录,小明1,以此类推。

    能看出来 mysql innoDB实现的并不是纯粹的MVCC 模式,其中还加入了X锁。严格来讲应该是 “X锁+MVCC”来达到MVCC的目的。

  • 相关阅读:
    智慧城市顶层设计策略方案(PPT)
    ant build.xml 解释!
    Excel poi API基础教程!
    操纵Excel文件的 ExcelUtil 类 !
    在selenium测试中使用XPATH功能函数starts-with、contains、descendant、ancestor、text()定位网页元素
    [ Selenium2 从零开始 by Bruce from http://seleniumcn.cn ] 1-8 视频集锦
    selenium 概念及练习 !
    selenium Object Page 设计模式理解及实现!
    使用TestNG 和 CSV文件进行数据驱动
    如何让评审人爱上我
  • 原文地址:https://www.cnblogs.com/luoluoshidafu/p/11528784.html
Copyright © 2011-2022 走看看