一:前言

  - 前面通过 《Mysql 事务 - 隔离》 的学习,知道了事务的实现,是根据 获取一致性视图 来实现的。

二:那么,什么时候会获取到一致性视图呢?

  - 例如:有三个事务,启动的详情如图(autocommit = 1)

  - 

  - 事务 A,B,C 查到的值是多少呢?

    - 事务 B 查到的 k 的值是 3,而事务 A 查到的 k 的值是 1

  

  - 理解

    - begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动

 

三:一致性视图的实现?

  - 在可重复读隔离级别下,事务在启动的时候就“拍了个快照”。注意,这个快照是基于整库的。

  - 这时,你会说这看上去不太现实啊。如果一个库有 100G,那么我启动一个事务,MySQL 就要拷贝 100G 的数据出来,这个过程得多慢啊。可是,我平时的事务执行起来很快啊。

  - 这就引入了 InnoDB 的 MVCC 概念。

四:多版本并发控制(MVCC)

  - 概念

    - Mysql 的大多数事务存储引擎实现的都不是简单的行级锁,一般都实现了 MVVC(多版本并发控制)

    - 不同的引擎对于MVCC的实现不同,典型的有(乐观并发控制/悲观并发控制)

   原理

    - 通过保存数据在某点的快照实现,也是就说,不过执行多长时间,每个事务看到的数据都是一致的。

    - 也就是说,事务的开始时间不同,对于同一张表,同一时刻看的的数据可能是不同的。

  - 详解

    你真的懂MVCC吗?来手动实践一下?

  - MVCC 流程 - 以 REPEATTABLE  READ (可重复读 - 隔离级别)举例

    - SELECT

      - InnoDB 只会查找版本早于当前事务版本的数据行,可以保证事务读取的行

      - 要么是在事务开始前已经存在的。

      - 要么是在事务自身插入或者修改过的。

      - 行的删除版本要么未定义,要么大与当前事务版本号这样可以确保事务读取到的行,在事务开始未被删除。

     - INSERT

      - 为新插入的一行保存当前的系统版本号作为行版本号。

    - DELETE

      - 为删除的一行保存当前的系统版本号作为行删除标识

    - UPDATE

      - 新插入一行记录,保存当前系统版本号作为行版本号。

      - 同时保存当前系统的版本号到原来的行,作为行删除标识。

  - 注意点

    - 保存着两个版本号,使得大多数的读操作都不需要加锁。

    - 这样的设计使得读数据更简单,性能很好,并且也能保证只会读到符合标准的行。

    - 不足是每行记录都需要额外的存储空间,需要做更多的维护工作。

    - 目前 MVCC 只工作在 读已提交/可重复读 两个隔离级别下

      - 读未提交 总会读取最新的行

      - 串行化则会对所有读取到的行加锁。

五:附录

  • * mysql> show table status like 'tblwechatTemplate' \G;
    * *************************** . row ***************************
    * Name: tblwechatTemplate
    * 表名
    * Engine: InnoDB
    * 引擎
    * Version:
    * Row_format: Dynamic
    * 行模式
    * Rows:
    * 表中的行数
    * 对于 MyIsam 和其他是准确的
    * 对于 InnoDB 是估计值
    * Avg_row_length:
    * 平均每行包含的字节
    * Data_length:
    * 表数据的大小
    * Max_data_length:
    * 表数据的最大容量,和存储引擎有关
    * Index_length:
    * 索引大小(字节)
    * Data_free:
    * Auto_increment:
    * 下个自增主键的值
    * Create_time: -- ::
    * 表创建时间
    * Update_time: -- ::
    * 表数据最后修改时间
    * Check_time: NULL
    * Collation: utf8_general_ci
    * 默认字符集和排序规则
    * Checksum: NULL
    * Create_options:
    * Comment: 模板消息模板id记录表

《Mysql - 事务 MVCC》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 数据结构实验之二叉树一:树的同构 (SDUT 3340)

    题解:把原本结构体的左右子树的类型定义成 int 型,用来存放这个结点的左右子树的编号,分别建造两棵二叉树,按个比较,如果在第二棵树中没有找到,那么就不用在判断了. #include <bits ...

  2. aws使用之负载均衡elb要点

    目录: 1.创建负载 2.目标群组 3.使用注意事项 4.总结 创建负载 alb负载 https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/la ...

  3. pc页面自动缩放到手机端

    今天做了个pc的页面,看了别人的网站在手机端能把pc端的网页刚好缩放到手机端,看着很舒服. 于是想把自己的页面也这样搞一下,刚开始,想到的是利用css3的缩放来做,想的是当屏幕尺寸改变时缩放整个页面, ...

  4. matplot 绘制折线图

    #coding=utf-8 import matplotlib.pyplot as pltx_data = ['2011','2012','2013','2014','2015','2016','20 ...

  5. 小程序自定义底部tab

    首页wxml的代码: <view class="nav" hover-class="none"> <view class="inde ...

  6. MongoDB与RoboMongo的安装+python基本操作MongoDB

        MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据 ...

  7. 切换node版本,node-sass安装报错

    一.问题 经常在开发过程中,会遇到切换node环境的情况,这时候切换之后,npm安装不了node-sass,有可能是之前把node-sass安装地址修改了,导致翻墙翻不了,所以安装不了. 二.解决 1 ...

  8. Factor_Analysis

    Factor_Analysis(因子分析) Factor Analysis 简书:较好理解的解释,其中公式有一定的推导(仅展现关键步骤,细节大多需要自行补充),基本为结论式. 感性层面理解:首先,明确 ...

  9. LC 456. 132 Pattern

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that  ...

  10. 手把手教你MyEclipseUML建模(下)

    手把手教你MyEclipseUML建模(下) 点击访问:手把手教你MyEclipseUML建模(上) 1.用UML 2建模 MyEclipse提供了以下UML 2特性: UML 2图:类.组件.部署. ...