mysql多版本并发控制MVCC的实现

事务隔离级别设置

set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //当前会话

修改事务提交方式(是否自动提交,mysql默认自动提交)

SET AUTOCOMMIT = 1; //自动提交,为0手动提交

不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制。

innodb

说明:

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number).每开始个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的

SELECT

InnoDB会根据以下两个条件检查每行记录:

a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插人或者修改过的。

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

只有符合上述两个条件的记录,才能返回作为查询结果。

INSERT

InnoDB为新插人的每行 保存当前系统版本号作为行版本号。

DELETE

InnoDB为删除的每行保存当前系统版本号作为行删除标识。

UPDATE

InnoDB为插人行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

注意:

MVCC只在REPEATABLE READ 和READ COMMITED 两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容法,因为READ UNCOMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。

查看当表的状态

show table status like 'task'\G;

脏读、不可重复读、幻读

脏读:当前事务读到了另一个事务未提交的状态,事务没有实现隔离。

不可重复读:实现了事务的隔离性,但两次读取同一条数据的时候发现数据不一致了。

幻读:两次查询同一批数据,发现有新数据被插入,主要是因为中途有其他事务对数据集进行了插入操作。(加了间隙锁解决该问题)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-10-08

MySQL essential版本和普通版本有什么区别?

MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支持.2. MySQL Enterprise Edition 企业版本,需付费,可以试用30天.3. MySQL Cluster 集群版,开源免费.可将几个MySQL Server封装成一个Server.4. MySQL Cluster CGE 高级集群版,需付费.5. MySQL

mysql 查看版本的方法图文演示

第一种方法: 1:在终端或windows下:mysql -V 即可. 能看出来版本是mysql Ver 14.14 Distrib 5.1.42, for Win32 (ia32),这个里面的5.1.42就是版本了. 第二种:在mysql中:mysql> status; 这个需要登录以后才可以.mysql -u root -p密码;效果如下图所示: 第三种:使用mysql的函数 select version();效果如下图所示 第四种方法:在help里面查找 ,这里分为windows下与linu

分享CentOS下MySQL最新版本5.6.13源码安装过程

2个月前公司给DBA的测试服务器被收回去了,一直跟开发用一组DB,有些需要测试的小功能,需要不断重启db,为了不影响开发同事,自己又申请了一个虚拟机,准备安装最新的5.6.13版本的MySQL社区版. 1 download the tar.gzwget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.13.tar.gz/from/http://cdn.mysql.com/ 2 安装cmake软件包yum install cmake 3

Mysql最新版本的数据库安装教程(5.7)

默认情况,在CentOS 6.8 下通过yum安装的是5.1.73版本,现在需求是安装5.7版本. Mysql官方网站:http://www.mysql.com Mysql说明文档:http://dev.mysql.com/doc/ --------------------------------------------------------------------------------------------------- 一.更改数据库安装源 在mysql官方网站上找到下载页面,选择其中

平台支持Mysql的版本说明

平台默认支持Mysql 4.0x-4.x 用户量使用最多的是Mysql 4.026, Mysql 4.1.18/19 在安装了myodbc 3.51.12版本的前提下,平台能支持MySQL 5.1.x以上版本 myodbc 3.51.12可以在受控端下载的地方,或必要软件下载的地方下载. 由于MySQL 5.1的用户量太少,有许多未知的问题不知道答案,因此建议用户小心使用. 经我们测试,mysql4,4.1,mysql5.1都能正常使用平台所有的开通,删除,修改密码,备份等系功能. mysql

深入理解PostgreSQL的MVCC并发处理方式

Postgre数据库的很大的卖点之一就是它处理并发的方式.我们的期望很简单:读永远不阻塞写,反之亦然.Postgres通过一个叫做 多版本并发控制(MVCC) 的机制做到了这一点.这个技术并不是Postgres所特有的:还有好几种数据库都实现了不同形式的MVCC,包括 Oracle.Berkeley DB.CouchDB 等等 .当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要.它事实上是复杂问题的一种非常优雅和简单的解法. MVCC如何工作 在Postgre

当mysqlbinlog版本与mysql不一致时可能导致出哪些问题

首先要确定当前版本是不是mysqlbinlog版本,当不是mysqlbinlog版本时可能会导致出哪些问题,下面通过模拟场景的方法给大家做介绍,希望对大家有所帮助. 看当前mysqlbinlog版本的方法: mysqlbinlog --version mysqlbinlog Ver 3.3 for Linux at x86_64 场景1:mysql服务器为mysql 5.6,要求mysqlbinlog版本为3.4及以上,否则mysqlbinlog解析时会直接报错,之前已经碰到过很多次,但是没有记

mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)

之前安装mysql 5.7.12时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 (一)mysql 5.7.13 安装配置方法 1.mysql-5.7.12-winx64.zip下载 官方下载地址:http://dev.mysql.com/downloads/mysql/ 2.解压到C:\job\mysql-5.7.12-winx64 3.在C:\job\mysql-5.7.12-winx64下新建my.ini配置文件 内容如下: ################

linux下mysql 5.7.16 免安装版本图文教程

本文为大家分享了mysql 5.7.16 免安装版本教程,供大家参考,具体内容如下 MySQL:  5.7.16  程序目录:/usr/local/MySQL 数据文件目录:  /data/mysql 下载地址http://dev.mysql.com/downloads/mysql/; Linux-Generic 为免安装版本,我选择的64位 具体安装方法mysql网站有文档,英文好的话就别看我写的了. 一.安装前准备 1.关闭防火墙 #setup中关闭 2.关闭selinux      #此项

利用rpm安装mysql 5.6版本详解

前言 其实之前使用yum安装MySQL确实很方便,但是默认安装的myql5.0版本的,不支持utf8mb4(utf8mb4扩展到一个字符最多能有4节,所以能支持更多的字符集,比如支持emoji表情)编码格式,所以要升级数据库,yum库升级貌似有点费劲,果断卸载了,使用rpm直接安装 卸载的时候遇到一些问题,要卸载干净请参考之前写的一篇文章:http://www.jb51.net/article/97516.htm 言归正传,如何安装呢,其实很简单: 安装过程 一.先到官网地址下载两个包. 下载地