一 前言
MySQL 在不同的事务隔离级别下提供两种读模式 一致性读(非加锁)当前读(加锁读)。当前读比较简单,本文主要研究一致性读取。
二 原理概念

官方概念

  1. "A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time. The query sees the changes made by transactions that committed before that point of time, and no changes made by later or uncommitted transactions.The exception to this rule is that the query sees the changes made by earlier statements within the same transaction. "

一致性读是指使用MVCC机制读取到某个事务已经提交的数据,其实是从undo里面获取的数据快照。不过也有特例: 在本事务内如果修改某个表之后的select 可以读取到该表最新的数据,后面的例子可以验证。   
三 不同事务隔离级别的一致性读
3.1 RR模式
从官方文档 "If the transaction isolation level is REPEATABLE READ (the default level), all consistent reads within the same transaction read the snapshot established by the first such read in that transaction."
在RR模式下,同一个事务内的一致性读的快照都是基于第一次读取操作时所建立的。下面我们做测试进行对RR模式下一致性读进行解读。
a)RR模式下事务的起始点是以执行的第一条语句为起始点的,而不是以begin作为事务的起始点的。

session 1

session2

test [RW] 10:01:33 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:02:12 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:02:22 >select * from ty;

Empty set (0.00 sec)

test [RW] 10:02:36 >insert into ty(a,b) values(1,2);

Query OK, 1 row affected (0.00 sec)

test [RW] 10:02:51 >commit;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:02:33 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    1 |    2 |

+----+------+------+

1 row in set (0.00 sec)

b)RR模式下的一致性读,是以第一条select语句的执行时间点作为snapshot建立的时间点的,即使是访问不同的表。

test [RW] 10:35:11 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:35:13 >select * from x;

+----+

| id |

+----+

|  1 |

|  2 |

+----+

2 rows in set (0.00 sec)

test [RW] 10:34:32 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:34:51 >insert into ty(a,b) values(2,4);

Query OK, 1 row affected (0.00 sec)

test [RW] 10:35:39 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    1 |    2 |

+----+------+------+

1 row in set (0.00 sec)

c)RR模式下,在本事务内如果修改某个表之后的对该表的select语句可以读取到该表最新的数据。

test [RW] 10:42:56 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:43:07 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    1 |    2 |

|  2 |    2 |    4 |

+----+------+------+

2 rows in set (0.00 sec)

test [RW] 10:35:34 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 10:43:25 >insert into ty(a,b) values(3,5);

Query OK, 1 row affected (0.00 sec)

test [RW] 10:43:38 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    1 |    2 |

|  2 |    2 |    4 |

|  3 |    3 |    5 |

+----+------+------+

3 rows in set (0.00 sec)

test [RW] 10:43:14 >update  ty set a = 5 where id=3;

Query OK, 1 row affected (4.23 sec)

Rows matched: 1  Changed: 1  Warnings: 0

test [RW] 10:44:30 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    1 |    2 |

|  2 |    2 |    4 |

|  3 |    5 |    5 |

+----+------+------+

3 rows in set (0.00 sec)

d)RR模式下同一个事务内,第一次查询是当前读操作则后续查询可以查看最新的数据。

test [RW] 11:07:23 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 11:07:26 >update ty set a=5 where id=2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

test [RW] 11:07:31 >begin;

Query OK, 0 rows affected (0.00 sec)

test [RW] 11:07:33 >select * from ty where id=2 for update;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  2 |    5 |    4 |

+----+------+------+

1 row in set (10.73 sec)

test [RW] 11:07:36 >insert into ty(a,b) values(6,7);

Query OK, 1 row affected (0.00 sec)

test [RW] 11:07:55 >commit;

Query OK, 0 rows affected (0.00 sec)

test [RW] 11:07:58 >select * from ty;

+----+------+------+

| id | a    | b    |

+----+------+------+

|  1 |    2 |    3 |

|  2 |    5 |    4 |

|  3 |    6 |    7 |  <-- 本事务还未commit,已经可以查看其他会话最新插入的数据

+----+------+------+

3 rows in set (0.00 sec)

这个例子要特别说明一下,从上面的实验结果上来看RR事务隔离级别下,一致性快照的建立仅仅和select语句第一次执行有关,不管是不是相关表。而且与其他 DML(insert,update,delete) 语句、for update 语句无关,在事务中第一次执行DML,后面的其他select 查询会是当前读即可获取到最新的数据。

3.2 RC模式 
RC 支持在本事务内读取到最新提交的数据,所以RC 事务隔离级别下的一致性读取比RR模式下的要简单很多。每个事务构建自己的快照,不相互干扰,除非其他事务已经提交,有兴趣的朋友自己测试吧。

  1. With READ COMMITTED isolation level, each consistent read within a transaction sets and reads its own fresh snapshot.

四 当前读 
和一致性读不太一样 ,当前读需要使用select  xx  for update,或者 lock in share mode ,读取最新的数据并且锁定被访问的行,(RC 加行锁,RR加gap锁 唯一键除外) 不管另外一个事务是否提交,如果另外的事务已经获取了相关的锁,则 for update,lock in share mode 语句则继续等待直到其他事务释放锁,并且获取到最新的数据。

五 小结
从上面的测试来看,RR模式下的一致性快照读会有比较多的特性(姑且叫做特性吧) 。RC模式本身支持不可重复读,能够查询到最新的其他事务最新提交的数据。基于上面的测试,还是比较推荐业务使用RC模式作为事务隔离级别的。
参考文章
[1] 一致性读深入研究
[2] 官方文档

【MySQL】浅谈一致性读相关推荐

  1. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  2. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  3. python 读excel字符型 数值_浅谈python 读excel数值为浮点型的问题

    浅谈python 读excel数值为浮点型的问题 如下所示: #读入no data = xlrd.open_workbook("no.xlsx") #打开excel table = ...

  4. 【读书笔记】舆情分析浅谈:读《论新媒体发展背景下网络舆情的发展及治理》有感

    舆情分析浅谈 读<论新媒体发展背景下网络舆情的发展及治理>有感 最近读了一些有关"舆情"的论文,其中印象比较深的有一篇<论新媒体发展背景下网络舆情的发展及治理&g ...

  5. MYSQL 浅谈MyISAM 存储引擎

    思维导图 介绍 mysql中用的最多存储引擎就是innodb和myisam.做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对<高性能MYSQL>书中提到的myisam ...

  6. 浅谈一致性Hash原理及应用

    在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/同一表中. 大佬 ...

  7. MySQL浅谈 LEFT JOIN

    On条件(在"A left join b on conditional_expr")决定如何从table B 中检索数据行(Matching-State); 如果B中没有行匹配On ...

  8. escilpse 连接mysql,浅谈docker-compose网络设置之networks

    networks使用方式之官网教程 networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题.这种应用在swarm部署中,非常常见.不过,本文并不做讨论. ...

  9. 读研心理健康建设---浅谈个人读研期间的心理变化

    近日听闻辽宁工程技术大学的谢同学事件,在此对他的离去表示哀悼,望他不再经历这番世间轮回.细数近年来国内高校出现的学生自杀.过劳死等事件,这背后有着太多辛酸悲苦,一个人的离去带走的不仅是他自己的尘世回忆 ...

最新文章

  1. 揭富人与穷人21个不同思维 看富豪如何脱颖而出
  2. ip dhcp snooping
  3. FileZilla Server安装配置教程
  4. 【干货】SqlServer 总结几种存储过程分页的使用
  5. oracle rman 架构图,图解Oracle RMAN备份入门
  6. 个性化推荐系统该如何评估,四种不同策略的角度
  7. 赤峰市职称计算机,关注丨赤峰今年评职称最新政策全在这……
  8. python小仙女_python——time库整理(基础知识+实例)
  9. 自定义ProgressBar(圆)
  10. Turtlebot2 环境配置
  11. redis的事务不是原子性
  12. Docker在linux下的安装
  13. 【基于JavaEE的医院药品管理系统的设计与实现】
  14. 在字符串s的第n个字符后面插入字符串t
  15. 6款办公软件,文案人员常用到
  16. 工厂模式总结——三个工厂
  17. 【视频开发】【CUDA开发】ffmpeg nvenc编码
  18. 他是阿里P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!...
  19. matlab solve函数错误【检查对函数 ‘solve‘ 的调用中是否缺失参数或参数数据类型不正确】
  20. STM32之独立看门狗

热门文章

  1. [VB]获取Access数据库的全部对象
  2. Uber无人车安全员之困:这是一份机械、枯燥、影响心理的工作
  3. ARM太贵,80多家科技巨头悄然站队开源芯片架构RISC-V
  4. 深度神经进化大有可为?Uber详解如何用它优化强化学习 | 5篇论文
  5. vue项目打包优化策略
  6. 大数据(3) - 高可用 HDFS HA
  7. aws平台中为ec2实例添加双网卡
  8. Intel张旭:通信和计算的融合将是5G的关键
  9. Convert.ToInt32()与int.Parse()的区别
  10. 优化网站性能 提高网站速度访问速度的14条实践(转)