《Mysql - 事务 MVCC》
一:前言
- 前面通过 《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 流程 - 以 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》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Turn Off Windows Firewall Using PowerShell and CMD
If you want to turn off the Windows Firewall, there are three methods. One is using the GUI which is ...
- (转)实验文档4:kubernetes集群的监控和日志分析
改造dubbo-demo-web项目为Tomcat启动项目 Tomcat官网 准备Tomcat的镜像底包 准备tomcat二进制包 运维主机HDSS7-200.host.com上:Tomcat8下载链 ...
- python 最小二乘 leastsq 函数实现 法线式 解决与x轴垂直问题
当使用y=kx+b时,与x轴垂直的直线无法计算.因此使用法线式ysin(theta)+xcos(theta) = dist.貌似这么用有点复杂了,直接使用ax+by=1不知道能不能计算,未测试. # ...
- Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
编译cartographer时遇到Unrecognized syntax identifier “proto3”. This parser only recognizes “proto2”.排查:使用 ...
- cesium地下模式(地表透明)3
这篇博客主要解决“瓦片的白色网格”问题 设置skirt=0可以解决这个问题,需要设置3个地方 1.HeightmapTerrainData.js createMesh方法 this._skirtHei ...
- dp之斜率优化
前几天想练练思维,所以从cf上随便找了一道dp题,看完题意后第一感觉很简单,就是简单的区间dp题,但是看到数据范围的我顿时就懵了,(1≤n≤105) emmmmmmmm,按照普通的思路肯定会超时的.. ...
- start、就绪、运行状态的demo演示
1.start状态: package com.roocon.thread.t1; public class NewThread implements Runnable { @Override publ ...
- chrome-添加JSON-handler插件
1.访问http://jsonhandle.sinaapp.com/下载 2.谷歌访问 chrome://extensions/ 然后找到你下载的JSON-handle_0.5.2.crx文件,直 ...
- 2018-2019-2 20165312《网络攻防技术》Exp 8 Web基础
2018-2019-2 20165312<网络攻防技术>Exp 8 Web基础 目录 一.相关知识点总结 二.实验内容 三.实验步骤 四.实验总结及问题回答 五.实验中遇到的问题及解决方法 ...
- NLog用法
NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种 ...