前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈一致性读

浅谈一致性读

作者头像
用户1278550
发布2018-08-09 10:37:14
3120
发布2018-08-09 10:37:14
举报
文章被收录于专栏:idbaidbaidba

一 前言 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作为事务的起始点的

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

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

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

这个例子要特别说明一下,从上面的实验结果上来看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] 官方文档

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档