我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解MySQL的一致性读

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解MySQL的一致性读

如何理解MySQL的一致性读,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一 前言
   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)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 |

+----+

|

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





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

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

test [RW] 10:43:14 >update



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

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

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

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模式作为事务隔离级别的。

关于如何理解MySQL的一致性读问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解MySQL的一致性读

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解Spark Streaming的数据可靠性和一致性

如何理解Spark Streaming的数据可靠性和一致性,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。眼下大数据领域最热门的词汇之一便是流计算了,其中最耀眼的项目无疑是来自S
2023-06-19

redis和mysql如何保证一致性

保证 redis 和 mysql 一致性的方法有直接写入 mysql 和事务补偿机制:直接写入 mysql:通过触发器将 mysql 数据变更同步到 redis,保证一致性但性能较低;事务补偿机制:先写入 redis,同时记录补偿事务,容忍
redis和mysql如何保证一致性
2024-04-20

一段话系列-mysql一致性视图中的当前读

mysql的innob引擎使用一致性视图(版本控制)来保证事务之间的隔离性,但是在业务中会有这样的清秀,一个字段值为3,在两个同时开启的事务中分别使用update语句进行-1,两个事务分别提交后,该字段的值不是2,而是1;有人会疑惑innob为了隔离性分别为每
2018-06-18

redis一致性问题如何解决

Redis是一个内存数据库,是单进程单线程的,所以它没有复制和分布式的特性。因此,Redis本身并没有提供一致性的解决方案。然而,可以使用以下几种方式解决Redis的一致性问题:1. 主从复制:Redis支持主从复制,可以将一个Redis实
2023-08-20

redis集群读写不一致如何解决

要解决Redis集群读写不一致的问题,可以考虑以下几种方法:1. 一致性哈希算法(Consistent Hashing):通过将键值对映射到一个固定的节点,使得数据在集群中分布更均匀。这样可以保证相同的键值对总是被映射到同一个节点上,从而保
2023-09-06

HBase如何处理数据的一致性和容错性

HBase通过多种技术来确保数据的一致性和容错性。一致性:HBase使用WAL(Write-Ahead Logging)来确保数据的一致性。在写入数据时,首先将数据写入WAL中,然后再将数据写入内存中。一旦数据成功写入WAL,即使服务器发
HBase如何处理数据的一致性和容错性
2024-03-06

MySQL中如何确保数据的一致性和完整性

在MySQL中,可以通过以下方式来确保数据的一致性和完整性:使用主键和外键约束:定义主键和外键可以确保数据表之间的关系,避免数据之间的不一致性。使用触发器:可以通过触发器来在数据插入、更新或删除前后执行特定的操作,从而确保数据的完整性。使用
MySQL中如何确保数据的一致性和完整性
2024-04-09

MySQL和Redis如何保证数据一致性

MySQL与Redis都是常用的数据存储和缓存系统。为了提高应用程序的性能和可伸缩性,很多应用程序将MySQL和Redis一起使用,其中MySQL作为主要的持久存储,而Redis作为主要的缓存。在这种情况下,应用程序需要确保MySQL和Re
2023-08-22

编程热搜

目录