Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySql】RR 与 RC的本质区别

【MySql】RR 与 RC的本质区别

作者头像
平凡的人1
发布于 2023-10-15 04:33:47
发布于 2023-10-15 04:33:47
84800
代码可运行
举报
运行总次数:0
代码可运行
本篇博客介绍的是RR与RC的本质区别,话不读说,直接进入主题即可。

当前读与快照读

select * from user lock in share mode ,以加共享锁方式进行读取,对应的就是当前读 不加lock in share mode就是快照读

  • 设置隔离级别RR

首先设置隔离级别RR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global transaction isolation level repeatable read;

设置完毕之后要进行重启终端才会生效。

两个场景

现在创建一张表插入一条数据用于测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into user (id, age, name) values (1, 15,'黄蓉');

情景一:事务A和事务B开启事务,然后对事务A与事务B进行快照读是一样的结果,现在对事务A更新数据age=18,然后提交事务;此时事务A已经是提交的了;而事务B进行快照读select * from,没有读取到18,这很好理解,这是可重复读的隔离级别嘛,事务B提交之后才能看到;但是如果此时事务B没提交,而事务B此时进行当前读select lock in share mode则可以读取到18

启动两个终端分别对应事务A与事务B,结果如下图所示:

在隔离性这里如果想读到最新数据也是可以读到的。

情景二:事务A的操作与情景一是一样的,事务A把age改成了28;但是事务B进行快照读是在事务A提交之后才进行的,此时看到的是28,之后如果在进行当前读读取到的也是28

情景一与情景二:唯一区别仅仅是表1的事务B在事务A修改age前快照读过一次age数据;而表2的事务B在事务A修改age前没有进行过快照读 对于情景一:事务B在快照读的时候mysql就给事务B形成了一个read view;快照的对象认为A是与其一块运行的。事务B认为事务A在自己的m_ids列表中。所以看不到事务A提交的修改了。情景二:事务B并没有快照读,没有形成read view对象,事务A提交之后才进行快照读,此时看待并发的事务时,事务A已经不存在了,此时事务B看到的事务列表的最小值都比事务A大,事务B 能看到事务A的修改。 事务中快照读的结果是非常依赖该事务首次出现快照读的地方,即某个事务中首次出现快照读,决定该事务后续快照读结果的能力;delete同样如此

RR 与 RC的本质区别

正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同;在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来 此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见。 即RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的而早于Read View创建的事务所做的修改均是可见 而在RC级别下的事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因

总之在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL笔记】正确的理解MySQL的MVCC及实现原理
MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
全栈程序员站长
2022/08/12
8290
【MySQL笔记】正确的理解MySQL的MVCC及实现原理
Linux——MySQL事务
当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现大于0,于是又卖了一次票。然后A将票数更新回数据库。这是就出现了同一张票被卖了两次。 CURD满足什么属性,能解决上述问题?
有礼貌的灰绅士
2025/05/15
520
Linux——MySQL事务
MySQL之MVCC原理详解
像select lock in share mode(共享锁); select for update, update,delete,insert(排它锁)这些操作就是一种当前读,因为它读取的是数据的最新版本,读取时还要保证其他事务不能修改当前记录,会对记录进行加锁。
用户10125653
2022/11/10
1.4K0
MySQL之MVCC原理详解
MySQL事务隔离实现原理,多版本并发控制MVCC
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
王二蛋
2024/07/03
2480
一文彻底读懂MySQL事务的四大隔离级别
之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~
捡田螺的小男孩
2020/04/15
7.6K2
一文彻底读懂MySQL事务的四大隔离级别
MVCC多版本并发控制
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
鳄鱼儿
2024/05/22
2700
MVCC多版本并发控制
浅析MySQL之MVCC机制
在分析 MVCC 的原理之前,我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。(注:下面没有特别说明默认 MySQL 的引擎为 InnoDB )
政采云前端团队
2023/10/24
3950
浅析MySQL之MVCC机制
MVCC 原理分析、MySQL是如何解决幻读的
还记得MySQL事务四大特性、并发事务问题、事务隔离级别吗?幻读又是什么呢?如果忘记可以到这里重新温习:MySQL基础:SQL分类DDL、DML、DQL、DCL;函数、约束、多表查询、事务、并发事务四大问题、事务隔离级别——脏写、脏读、不可重复读、幻读
寻求出路的程序媛
2024/05/22
7830
MVCC 原理分析、MySQL是如何解决幻读的
看一遍就理解:MVCC原理详解
MVCC实现原理是一道非常高频的面试题,最近技术讨论群的小伙伴一直在讨论,趁着国庆节有空,我们一起来聊聊。
捡田螺的小男孩
2021/10/19
1.3K0
看一遍就理解:MVCC原理详解
事务隔离级别实现原理
数据库隔离级别以及Mysql实操 一文中,我描述了为了解决并发事务间的冲突,实现事务的隔离性,SQL标椎定义了四种隔离级别,今天就通过这篇文章来看下SQL标准中每种隔离级别的实现原理以及InnoDB引擎又是如何实现的。
Orlion
2024/09/02
2190
事务隔离级别实现原理
网易三面:说说你对MySQL事务四大隔离的理解
之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助,MySQL笔记需要可以自取。
Java程序猿
2022/04/03
2740
干了三年Java后端,你竟然还不知道MySQL的四大隔离级别?
之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够清楚,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~
Java程序猿
2021/02/20
5270
【MySQL基础篇重点】十一、事务管理(超级干货,你需要的都在这!)
​ 假设我今天买彩票中了五百万元,正高兴着准备往家人账号进行转账的时候,此时这个转账动作分为下面几步:
利刃大大
2025/05/22
1610
【MySQL基础篇重点】十一、事务管理(超级干货,你需要的都在这!)
Innodb的RR到底有没有解决幻读?
在InnoDB中,Repeatable Read(重复读)隔离级别通过间隙锁和MVCC机制解决了大部分的幻读问题,但并非所有幻读都能被解决。要彻底解决幻读,需要使用Serializable(可串行化)隔离级别。
@派大星
2024/04/25
5550
Innodb的RR到底有没有解决幻读?
通俗易懂数据库MVCC讲解,后悔没早点学
全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。以下文章都是围绕InnoDB引擎来讲,因为myIsam不支持事务。
公众号 IT老哥
2020/09/16
4.6K0
通俗易懂数据库MVCC讲解,后悔没早点学
MySQL事务管理
由于访问mysqld的设备不止一个,因此对于mysqld内部的数据,每一个设备都可以将其进行修改。而修改的过程是以多线程的方式并发控制的,这个时候,就大概率会产生一系列的线程安全问题。
每天都要进步呀
2023/10/16
3210
MySQL事务管理
深入理解MySQL中事务隔离级别的实现原理
说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。
X先生
2020/09/29
4.5K0
探究InnoDB可重复读
高爽
2017/12/28
1.1K0
探究InnoDB可重复读
MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)
MVCC是多版本并发控制(Multi-Version Concurrency Control),是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现已提交读和可重复读隔离级别,也经常称为多版本数据库。MVCC机制会生成一个数据请求时间点的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。从用户的角度来看,好象是数据库可以提供同一数据的多个版本(系统版本号和事务版本号)
终有救赎
2023/11/08
1.9K0
MySQL MVCC多版本并发控制(脏读和不可重复读解决原理)
深入理解InnoDB的MVCC多版本并发机制
上面我们说到了InnoDB在RR隔离级别下解决了幻读问题,又保证了高并发的读取(避免了读写串行化),那他到底是如何做的呢?
绿水长流z
2025/01/03
1290
深入理解InnoDB的MVCC多版本并发机制
相关推荐
【MySQL笔记】正确的理解MySQL的MVCC及实现原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验