一:前言

  - 前面通过 《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. Codechef July Challenge 2019 Division 1题解

    题面 \(CIRMERGE\) 破环成链搞个裸的区间\(dp\)就行了 //quming #include<bits/stdc++.h> #define R register #defin ...

  2. 修改input输入框的样式

    直接上代码 <style> .input{ -web-kit-appearance:none; -moz-appearance: none; font-size:1.4em; height ...

  3. lucene正向索引(续)——每次commit会形成一个新的段,段"_1"的域和词向量信息可能存在"_0.fdt"和"_0.fdx”中

    DocStoreOffset DocStoreSegment DocStoreIsCompoundFile 对于域(Stored Field)和词向量(Term Vector)的存储可以有不同的方式, ...

  4. Spring tools

    sts是什么? sts是spring tool suite的缩写,是基于eclipse的.开发spring应用的定制的开发环境. 提供了什么? 实现.调试.运行.部署spring应用的现成的环境.包括 ...

  5. javascript中的contains方法和compareDocumentPosition方法

    IE有许多好用的方法,后来都被其他浏览器抄袭了,比如这个contains方法.如果A元素包含B元素,则返回true,否则false.唯一不支持这个方法的是IE的死对头firefox.不过火狐支持com ...

  6. qt Qt5开发

    本章将介绍使用Qt5开发.我们将告诉你如何安装Qt SDK,如何使用Qt Creator IDE创建以及运行一个简单的Hello World应用程序. 一.安装Qt5 SDK Qt SDK包括构建桌面 ...

  7. 【DOS】取某目录下某类型文件信息放入文本

    C:\Users\horn1\Desktop\新建文件夹>dir *.jar >1.txt 这样,所有扩展名为jar的文件信息就送到新建的文本文件1.txt中了.虽然简单,但也是个常用功能 ...

  8. Android插件化(五):OpenAtlasの四大组件的Hack

    Android插件化(五):OpenAtlasの四大组件的Hack   转 https://www.300168.com/yidong/show-2776.html 核心提示:引言到目前为止,我们已经 ...

  9. 简易的CRM系统案例之Servlet+Jsp+MySQL版本

    数据库配置 datebase.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/infos usernam ...

  10. HTML5 地理位置定位API(3)

    HTML5 地理位置定位实例 这篇文章主要为大家介绍了HTML5地理定位的方法,实例讲述了html5获取坐标完整实现过程, 并对比不同浏览器运行效果给出参考结果,需要的朋友可以参考下 本文实例讲述了h ...