一:前言

  - 前面通过 《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. 【原创】go语言学习(四)流程控制

    目录: 1.if else语句块 2.for语句 3.switch语句 if else语句块 1.基本语法 if condition { //do something } if statement; ...

  2. Ubuntu 14.04 卸载通过源码安装的库

    cd cere-solvermkdir buildcd buildcmake ..sudo makesudo make install 卸载通过以上方式源码安装的库 再次进入buildsudo mak ...

  3. vue-cli3.0的记录

    页面打包的话,需要在根目录创建一个js文件 vue.confing.js 打包app的话,在dist里面只拿自己需要的静态文件

  4. 搞定TADA68机械键盘的固件修改

    一.先到http://config.qmk.fm,在键盘型号中选择tada68,千万不要选择错了,可在kdemap name中为自己的键位名个名,例如:vimgood 二.修改自己的键位,都是可视化的 ...

  5. 说出Servlet的生命周期,并说出Servlet和CGI的区别。

    说出Servlet的生命周期,并说出Servlet和CGI的区别. 山治ZHrx5 | 浏览 1377 次 推荐于2016-09-16 22:39:19 最佳答案 Servlet的生命周期分为5个阶段 ...

  6. Nut和nuTilda【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/72176-nut-nutilda.html phile: ...

  7. 胜利点 选题 Scrum立会报告+燃尽图 02

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8683] 一.小组介绍 组长:贺敬文 组员:彭思雨 王志文 位军营 杨萍 ...

  8. 微信小程序:自定义导航栏

    在小程序开发的时候会遇到一些页面不需要头部导航,或像淘宝的商品详情一样自定义的导航栏.那先要清楚这导航可不能写死,每种手机的导航都各不相同. 一.在app.json的window对象中定义导航的样式: ...

  9. idea使用maven私服

    nexus3中央仓库改为阿里云/ 参考:这里写链接内容  找到中央仓库 然后修改成:  http://maven.aliyun.com/nexus/content/groups/public/   1 ...

  10. PyTorch Tutorials 2 AUTOGRAD: AUTOMATIC DIFFERENTIATION

    %matplotlib inline Autograd: 自动求导机制 PyTorch 中所有神经网络的核心是 autograd 包. 我们先简单介绍一下这个包,然后训练第一个简单的神经网络. aut ...