Mysql可重复读(1) —— 快照何时创建

栏目: 数据库 · 发布时间: 6年前

内容简介:以前,对可重复读的理解,就是别的事务的提交,对当前事务的查询结果,不会产生影响;后来,知道事务在一开始的时候,会生成一个快照;不过这样的对可重复读的理解,依然肤浅。

以前,对可重复读的理解,就是别的事务的提交,对当前事务的查询结果,不会产生影响;

后来,知道事务在一开始的时候,会生成一个快照;

不过这样的对可重复读的理解,依然肤浅。

在我看来,要想真正弄懂可重复读,至少要把以下几个名词,能够串起来,解释清楚:

从这一讲开始,我就试着用各种例子,把这些知识串起来,给大家讲清楚到底什么是 Repeatable Read .

先从简单的开始, 我们说的“快照”,是什么时候开始创建的?

有同学说,快照在begin的时候就创建了。

是吗?

我们建一张极简的表:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

插入两条数据:

insert into t values(1,1),(2,2);

然后按照下面表格的顺序,在两个会话窗口执行如下 sql 语句:

Mysql可重复读(1) —— 快照何时创建

你可以像我这样,打开两个命令行窗口,分别执行:

Mysql可重复读(1) —— 快照何时创建

如果 Mysql 真的是在begin的时候,就创建了快照,那么session A执行select语句时,查询到的c应该是1,但是,实际查询到的,却是3,说明begin后,快照并没有立刻生成。

于是我们试着把select语句放到session B的update语句之前:

Mysql可重复读(1) —— 快照何时创建

这次你会发现,session A在执行第二天select语句时,查询到的c还是1,说明快照已经在执行第一条select语句时生成了,session B的update对session A不产生影响。

那么是不是就可以说,快照会在执行那些操作mysql数据库的sql语句时生成呢?

并不是, 只有“快照读”的sql语句,才会生成快照 ,比如 不加锁的select语句

而“当前读”的sql语句,是不会生成快照的,比如update,select … for update, select .. lock in share mode等;

所以下面这个例子,session A在select时看到的还会是被session B修改的数据,因为在update时并没有生成快照:

Mysql可重复读(1) —— 快照何时创建

那你说,我就是想在begin时就生成快照呢?

送你一条sql:

start transaction with consistent snapshot;

小结一下:

  • 可重复读的关键,来自于“快照”
  • “快照”并不是在begin后就生成,而是在第一条“快照读”语句后才生成

那么问题又来了,“快照”到底是啥?是对当前数据的全量拷贝吗?难道每开启一个事务,都要把当前数据库的数据拷贝一份出来?

下一讲,咱们来聊聊可重复读的实现原理 —— MVCC。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UML和模式应用

UML和模式应用

拉曼 / 李洋、郑䶮 / 机械工业出版社 / 2006-5 / 66.00元

《UML和模式应用(原书第3版)》英文版面世以来,广受业界专家和读者的好评,历经3个版本的锤炼,吸收了大量OOA,D的精华思想和现代实践方法。全书叙述清晰、用词精炼、构思巧妙,将面向对象分析设计的概念、过程、方法、原则和个人的实践建议娓娓道来,以实例为证,将软件的分析和设计的过程叙述得如逻辑推理一般,于细节处见真知。 《UML和模式应用(原书第3版)》是一本经典的面向对象分析设计技术的入门书......一起来看看 《UML和模式应用》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具