一:前言

  - 前面通过 《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. 初步学习MySQL

    我们之前学习如何安装MySQL数据库 以及 navicat 管理数据库可视化工具 那么现在主要来学习一下如何使用,(操作数据库有很多方式,终端操作.可视化工具操作.编程语句操作) 我们首先学习在终端操 ...

  2. webpack4温习总结

    webpack是一个模块打包器,可以根据入口文件,随着依赖关系将所有文件打包成js文件. 首先需要node环境,百度一下自己安装 webpack官网地址:https://www.webpackjs.c ...

  3. ROStopic 通信方式

    操作演示,对 topic 通信方式的理解请看:点击打开链接 开启终端,运行 roscore 新开一个终端(已经安装好(ros-<distro>-ros-tutorials 包,否则运行  ...

  4. hadoop2.9.2 调整jvm

    错误:namenode挂掉 查看hadoop的日志文件,发现存在大量的GC,导致namenode挂掉 命令行执行错误信息: 解决: 查看系统内存: # /data1/hadoop/hadoop/etc ...

  5. 入门cmake,窥探编译过程

    https://www.cnblogs.com/hg-love-dfc/p/10242391.html https://www.cnblogs.com/hg-love-dfc/p/10244328.h ...

  6. 安装virtual box

    将安装包放在app目录下: 进入安装目录,输入sudo gdebi 安装包名 安装完后,可以在搜索框中搜索:virtual 会出现安装好的虚拟机盒子.

  7. mysql转移Data目录

    本来很简单的事,为何这么复杂,转目录后经常不成功.mysql安装时就不能指定数据目录吗?老是默认在C盘 测试环境Windows10, mysql5.7,以下是测试记录: 1. 复制Data到D盘下,如 ...

  8. [游戏开发]LÖVE2D(1):引擎介绍

    什么是LÖVE引擎 Love引擎是一个非常棒的框架,你可以用来在Lua制作2D游戏.它是免费的,开源的,适用于Windows,Mac OS X,Linux,Android和iOS. 怎么安装 在官网下 ...

  9. postgresql 的 .pgpass密码文件的使用

    pgpass 是 连接 postgresql 时使用的密码文件,通常位置为 ~/.pgpass.在使用某些组件时还真的必须使用.具体的格式为: hostname:port:database:usern ...

  10. DIOCP任务队列和工作线程

    DIOCP任务队列和工作线程 涉及4个单元文件:utils_strings.pas,utils_queues.pas,utils_queueTask.pas,utils_grouptask.pas. ...