首页
学习
活动
专区
圈层
工具
发布

mysql rc和rr

基础概念

MySQL中的RC(Read Committed)和RR(Repeatable Read)是两种不同的隔离级别。

  • RC(Read Committed):这是MySQL的默认隔离级别。在RC级别下,一个事务只能看到已经提交的事务所做的更改。换句话说,一个事务在读取数据时,只能看到在该事务开始之前已经提交的数据。如果在读取过程中有其他事务对数据进行了修改并提交,那么当前事务在下一次读取时会看到这些更改。
  • RR(Repeatable Read):这是比RC更高的隔离级别。在RR级别下,一个事务在执行期间看到的数据是一致的。即使在事务执行期间有其他事务对数据进行了修改并提交,当前事务看到的数据也不会改变。这通过多版本并发控制(MVCC)来实现,即每个事务看到的都是数据的一个快照。

相关优势

  • RC的优势
    • 允许更高的并发性,因为读操作不会阻塞写操作,写操作也不会阻塞读操作(除了在行锁的情况下)。
    • 实现相对简单。
  • RR的优势
    • 提供了更强的一致性保证,确保在事务执行期间看到的数据是一致的。
    • 防止了不可重复读(Non-repeatable Read)问题,即在一个事务中多次读取同一数据时,结果不一致。

类型与应用场景

  • RC类型
    • 适用于对数据一致性要求不是特别高,但对并发性能要求较高的场景。
    • 例如,一些报表系统、日志系统等。
  • RR类型
    • 适用于对数据一致性要求较高的场景。
    • 例如,金融系统、电商系统等,这些系统需要确保在事务执行期间看到的数据是一致的。

常见问题及解决方法

问题1:为什么在RR隔离级别下会出现幻读(Phantom Read)?

原因:幻读是指在一个事务中多次执行相同的查询,但结果集的数量不同。这是因为在RR隔离级别下,虽然可以防止不可重复读,但无法防止其他事务插入新的行。

解决方法

  • 使用更高的隔离级别,如Serializable(串行化)。
  • 在应用层面进行处理,例如通过锁机制来防止其他事务插入新的行。

问题2:为什么在RC隔离级别下会出现脏读(Dirty Read)?

原因:脏读是指一个事务读取到了另一个事务未提交的更改。在RC隔离级别下,一个事务只能看到已经提交的事务所做的更改,但如果另一个事务在读取过程中对数据进行了修改但未提交,当前事务可能会读取到这些未提交的更改。

解决方法

  • 提高隔离级别到RR或Serializable。
  • 在应用层面进行处理,例如通过事务管理来确保读取的数据都是已经提交的。

示例代码

以下是一个简单的示例,展示如何在MySQL中设置隔离级别:

代码语言:txt
复制
-- 设置会话隔离级别为RR
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 开始一个事务
START TRANSACTION;

-- 执行一些读操作
SELECT * FROM your_table;

-- 提交事务
COMMIT;

参考链接

希望以上信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【MySql】RR 与 RC的本质区别

本篇博客介绍的是RR与RC的本质区别,话不读说,直接进入主题即可。...之后如果在进行当前读读取到的也是28 情景一与情景二:唯一区别仅仅是表1的事务B在事务A修改age前快照读过一次age数据;而表2的事务B在事务A修改age前没有进行过快照读 对于情景一:事务B在快照读的时候mysql...,从而造成RC,RR级别下快照读的结果的不同;在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来 此后在调用快照读的时候,还是使用的是同一个...而早于Read View创建的事务所做的修改均是可见 而在RC级别下的事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以看到别的事务提交的更新的原因 总之在...RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。

1.4K20

MySQL 主键索引在 RR 和 RC 隔离级别下的加锁情况总结

我今天抽时间给大家总结一个 MySQL InnoDB 存储引擎各种不同 SQL 情况下,加行锁、间隙锁、next-key lock 做一个总结。如果有错误的地方,请大家指正! ?...注意,我是在 MySQL 5.7 版本上测试的 ? 在开始之前,我先来解释一下,RR 和 RC。 RR 隔离级别就是,可重复读。REPEATABLE READ。 RC 隔离级别就是,读已提交。...搞明白 RR 和 RC 后,我们先来看第一种情况。查询条件是聚簇索引,也就是主键索引的精确匹配情况。 ?...上面这种情况下,如果 SQL 是精确查询,不管是 RR 还是 RC 隔离级别下,都会在命中的索引上加 record lock(行锁)。X 锁是排它锁(Exclusive Lock),也有人称作是写锁。...第三种情况,在 RR 隔离级别下,会在所有命中的行的聚簇索引上加 next-key locks(锁住行和间隙)。最后命中的索引的后一条记录,也会被加上 next-key lock。 ?

2.4K40
  • MySQL,InnoDB快照读,在RR和RC下有何差异?(第10讲,超硬核)

    快照读(Snapshot Read) MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent...RR下,某个事务首次read记录的时间为T,未来不会读取到T时间之后已提交事务写入的记录,以保证连续相同的read读到相同的结果集; 画外音:可以看到 (1)和并发事务的开始时间没关系,和事务首次read..., 2, 3},因为事务B是在时间T之后提交的,A4得读到和A2一样的记录; 提问2:假设事务的隔离级别是读提交RC,A2, A3, A4又分别读到什么结果集呢?...提问4:假设事务的隔离级别是读提交RC,A2, A3, A4的结果集又是什么呢? 回答:事务的开始时间不一样,不会影响“快照读”的结果,所以结果集和case 1一样。...提问8:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢? 回答:事务的开始时间不一样,不会影响“快照读”的结果,所以结果集和case 3一样。 啰嗦说了这么多,最后总结: 1.

    26910

    MySQL中RR隔离级别转换成RC隔离级别案例

    先了解RR(REPEATABLE-READ)和RC(READ-COMMITTED)的区别。 RR隔离级别增加了间隙锁,避免了幻读,并且阻止了不可重复读,让同一个事务里面的查询和修改都是一致的。...MySQL默认的隔离级别就是RR。 虽然说RC隔离级别在同一个事务内会存在查询出不同数据的现象,但是这些数据都必然是提交过的,是真实存进硬盘的数据。...所以也不用过分担忧,而且RC隔离级别反而降低了锁粒度,也不是毫无用处。Oracle和sql server默认的隔离级别类似RC。...问题就在于事务里面存在RR隔离级别转换成RC的问题,造成数据返回不正确,导致代码返回错误,但是数据是准确的。...正常的RR事务 先看当前环境信息: #当前的mysql版本 mysql> select @@version; +------------+ | @@version  | +------------+ |

    1.9K20

    为什么MySQL默认的隔离级别是RR而大厂使用的是RC?

    那么接下来就MySQL的读写分离和binlog为突破点进行分析为什么大厂中的默认隔离级别是RC。总体来说以时间线为基准进行讲解。...2binlog格式 3为什么MySQL默认的隔离级别是RR 参考:互联网项目中mysql应该选什么事务隔离级别 在Oracle,SqlServer中都是选择读已提交(Read Commited)作为默认的隔离级别...4为什么大厂MySQL设置的隔离级别是RC RC和RR的一个很大的区别是RR解决了不可重复读的问题。但是仔细想一想,不可重复读是问题吗?其实不是问题。...RC反应的是真实数据的变迁。主要数据真实有效(没提交就是脏读,无效),为什么怕被别人读出来呢? RR下有间隙锁,使用锁就会导致资源的消耗和等待。...存在的问题: 幻读:当用户发起一个事务,该事务已经写入redo日志和binlog日志,所以该数据为有效状态。在RC隔离级别下其他事务是可以读取到的。

    1.7K10

    【SQLMySQL 事务的隔离级别】什么是RU、RC、RR?

    如标题所示,看到RU、RC、RR把人整懵圈了,知道代表的是事务的隔离级别,但具体含义却记不得了,所以记录、回顾一下。...SQL中的事务隔离级别定义了事务在并发环境下如何相互隔离,以避免并发事务之间的各种问题,如脏读、不可重复读和幻读。...不同的数据库管理系统可能支持不同的隔离级别,但大多数遵循SQL标准的数据库系统,包括MySQL和PostgreSQL,都支持以下四个隔离级别: 读未提交(Read Uncommitted): 在这个隔离级别下...串行化(Serializable): 这是最高的隔离级别,事务会完全隔离,事务的执行就像是在串行环境中一样,事务依次逐个执行,避免了脏读、不可重复读和幻读。...较低的隔离级别(如读未提交和读已提交)可能会提高并发性能,但牺牲了数据的一致性。较高的隔离级别(如可重复读和串行化)提供了更强的数据一致性保证,但可能会降低并发性能。

    39310

    MySQL默认隔离级别是RR,但是为什么一些大厂会改成RC?

    可能大部分人都只知道MySQL的隔离级别有4个,分别是RU读未提交、RC读已提交、RR可重复读和Serializable可串行化,很少有人知道MySQL默认的隔离级别是RR,Oracle默认的隔离级别是...为了解决这个问题,MySQL采用了RR这种隔离级别,因为在RR中,会在更新数据的时候增加记录锁的同时增加间隙锁,可以避免事务乱序的情况发生。 为什么大厂要将隔离级别修改成RC?...在MySQL中,只有RR和RC这两种隔离级别才会使用一致性读。 在RC中,每次读取都会重新生成一个快照,总是读取行的最新版本。也因此事务中每次select也可以看到其它已commit事务所做的修改。...MySQL的binlog主要支持三种格式,分别是statement、row和mixed。 在RC中,只支持row格式的binlog。...为什么RC可以减少死锁发生? 因为RR会增加Gap Lock和Next-Key Lock,这就使得锁的粒度变大了,那么就容易导致死锁的概率增大(占地太宽了,别人占不到地方了)。

    2.7K20

    InnoDB,快照读,在RR和RC下有何差异?(很多人,以为自己懂了...)

    MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent Nonlocking Read...画外音:本文所有讨论基于MySQL-InnoDB。 什么是读提交(Read Committed)?...(1)数据库领域,事务隔离级别的一种,简称RR; (2)它不但解决“读脏”问题,还部分解决了“读幻影行”问题,同一个事务里,连续相同的read读到相同的结果集; 在读提交(RC),可重复读(RR)两个不同的事务的隔离级别下...case 2,仍然是上面的两个事务,只是A和B开始时间稍有不同(B先于A开始,B先于A结束): B1: start transaction; A1: start transaction...提问6:假设事务的隔离级别是读提交RC,A2的结果集又是什么呢?

    83030

    【MySQL百日打怪升级第18天】事务隔离级别详解:RC、RR、Serializable 到底怎么选?

    【第18天】每天一个MySQL知识点,百日打怪升级事务隔离级别详解:RC、RR、Serializable到底怎么选?大家好,我是一名拥有10年以上经验的DBA老兵。...他问我:"是不是MySQL缓存有问题?"我说:"不是缓存问题,是隔离级别的问题。"问了一下——他们用的READCOMMITTED(RC)。...一个经典面试题:RC和RR到底怎么选?这个借用一个前同事的原话,我觉得说得特别好——"如果你要确保事务内多次读结果一致,选RR;如果你更在意并发性能,而且能接受读到最新的已提交数据,选RC。"...很多人以为RR是"从头到尾读一样",实际上当前读和快照读用的是两套数据这个面试也常问,记一下RC下binlog必须用ROW格式MySQL官方文档有一句:binlog_format=STATEMENT下如果用了...RR下当前读会读到最新版本的数据,之后事务的快照读会看到自己修改后的结果。想想UPDATE前后数据的变化。为什么MySQL官方推荐RC+ROW格式binlog?为什么不推荐RR+STATEMENT?

    35210

    MySQL RR隔离级别的更新冲突策略

    对于事务的隔离级别,MySQL中默认是RR, Oracle中默认是RC,两个事务隔离级别存在着很大的差别,而换句话说,就算是RR的事务隔离级别级别,同是关系型数据库MySQL,SQLServer,postgreSQL...之前看到过丁奇大师的一篇文章,是分析InnoDB的在隔离级别RR下的一个“诡异”现象。...读来受益匪浅,丁大师不光明理而且还能改动代码解决问题,实在佩服,我在自己的环境中也做了一些简单的测试和分析。 首先是初始化基础数据,我们开启两个窗口,创建一个测试表,插入两条记录。...首先看下RR本身的现象,会话1开启一个事务,会话2插入一条记录,在会话1中查询应该还是2条数据。...| | 4 | name4 | +----+-------+ 3 rows in set (0.00 sec) 所以这就是更新冲突的策略了,目前的MySQL在RR隔离级别下的实现是这样。

    1.6K50

    MySQL Cases-MySQL找出谁持有行锁(RR)

    找出谁持有行锁(RR级别)https://cloud.tencent.com/developer/article/1869793 MySQL找出谁持有行锁(RC级别)https://cloud.tencent.com...MySQL下加锁都是对索引进行加锁。...、SR 都解决了,这就是为什么MySQL在默认事务隔离下达到隔离性要求,但是锁比较重,然而RR比serializable要好,下面我们看下RC和RR级别下,锁的粒度,我们以MySQL8.0为参考。...X:代表Next-Key Lock锁定记录本身和记录之前的间隙(X)。 S:代表Next-Key Lock锁定记录本身和记录之前的间隙(S)。 X,REC_NOT_GAP:代表只锁定记录本身(X)。...X:代表Next-Key Lock锁定记录本身和记录之前的间隙(X)。 S:代表Next-Key Lock锁定记录本身和记录之前的间隙(S)。 X,REC_NOT_GAP:代表只锁定记录本身(X)。

    1.8K52

    ✅为什么MySQL默认使用RR隔离级别?

    对于数据库的默认隔离级别,Oracle默认的隔离级别是 RC,而MySQL默认的隔离级别是 RR。那么,你知道为什么Oracle选择RC作为默认级别,而MySQL要选择RR作为默认的隔离级别吗?...首先,我们排除了Serializable和Read Uncommitted这两种级别,原因是一个隔离级别过高会影响并发度,另一个过低则存在脏读问题。剩下的RR和RC两种,如何选择呢?...集群内的机器分为主服务器(Master)和从服务器(Slave),主服务器负责提供写服务,而从服务器则提供读服务。在MySQL主从复制过程中,数据的同步通过binlog进行。...MySQL的binlog主要支持三种格式,即statement、row和mixed。MySQL从5.1.5版本开始支持row格式,在5.1.8版本中开始支持mixed格式。...这就导致主库和备库的数据不一致了!!!为了解决这种问题,MySQL将数据库的默认隔离级别设置为Repeatable Read。

    78310

    为什么MySQL默认使用RR隔离级别?

    对于数据库的默认隔离级别,Oracle默认的隔离级别是 RC,而MySQL默认的隔离级别是 RR。 那么,你知道为什么Oracle选择RC作为默认级别,而MySQL要选择RR作为默认的隔离级别吗?...首先,我们排除了Serializable和Read Uncommitted这两种级别,原因是一个隔离级别过高会影响并发度,另一个过低则存在脏读问题。 剩下的RR和RC两种,如何选择呢?...集群内的机器分为主服务器(Master)和从服务器(Slave),主服务器负责提供写服务,而从服务器则提供读服务。 在MySQL主从复制过程中,数据的同步通过binlog进行。...MySQL的binlog主要支持三种格式,即statement、row和mixed。MySQL从5.1.5版本开始支持row格式,在5.1.8版本中开始支持mixed格式。...这就导致主库和备库的数据不一致了!!! 为了解决这种问题,MySQL将数据库的默认隔离级别设置为Repeatable Read。

    55510

    MySQL8.03 RC 已发布

    导读 MySQL 8.03 RC 已发布~ 翻译团队:知数堂藏经阁项目 - 琅琊阁 团队成员:琅琊阁-小剑伯、 琅琊阁-江b 、琅琊阁-简小鹿 原文出处:http://mysqlserverteam.com...is available MySQL8.03 RC 已发布。...(RC1), is now available for download at dev.mysql.com (8.0.3 adds features to 8.0.2, 8.0.1 and 8.0.0...MySQL开发团队非常高兴地宣布,第一个8.0 RC版本8.0.3现已可在dev.mysql.com下载(相对于8.0.2,8.0.1和8.0.0,8.0.3添加了一些新特性)。...当服务收到包含不知道的字段的X协议消息时,此功能有助于检测客户端应用程序和MySQL服务之间的兼容性问题。 实现了一个低级别的客户端/连接器库通过内部和外部组件连接MySQL服务都将使用X协议。

    1.4K20

    MySQL默认隔离级别为什么是RR

    多次听到“MySQL为什么选择RR为默认隔离级别”的问题,其实这是个历史遗留问题,当前已经解决,但MySQL的各个版本沿用了原有习惯。...隔离级别 MySQL默认的隔离级别为 RR(Repeatable Read),在此隔离级别下,对比binlog格式为ROW、STATEMENT是否会造成主从数据不一致 2.1 ROW格式 其实不用测试大家也应该对...03 RC隔离级别 3.1 ROW格式 为了和之前的步骤一致,先初始化数据 root@testdb:3306 12:14:27>truncate table users; Query OK,...04 结语 通过上述的实践,可以发现在RR级别下,binlog为任何格式均不会造成主从数据不一致的情况出现,但是当低版本MySQL使用RC+STATEMENT组合时(MySQL5.1.5前只有statement...当前这个历史遗漏问题以及解决,大家可以将其设置为RC+ROW组合的方式(例如ORACLE等数据库隔离级别就是RC),而不是必须使用RR(会带来更多的锁等待),具体可以视情况选择。

    1.7K10

    MySQL8.03 RC 已发布

    The MySQL 8.0.3 Release Candidate is available MySQL8.03 RC 已发布。...(RC1), is now available for download at dev.mysql.com (8.0.3 adds features to 8.0.2, 8.0.1 and 8.0.0...MySQL开发团队非常高兴地宣布,第一个8.0 RC版本8.0.3现已可在dev.mysql.com下载(相对于8.0.2,8.0.1和8.0.0,8.0.3添加了一些新特性)。...就像之前,MySQL提供密码到期策略,密码到期时强制更改密码。MySQL也有能力控制什么内容可以和不能用作密码。限制了密码重用,从而迫使用户在每个密码更改时提供新的强密码。...当服务收到包含不知道的字段的X协议消息时,此功能有助于检测客户端应用程序和MySQL服务之间的兼容性问题。 实现了一个低级别的客户端/连接器库通过内部和外部组件连接MySQL服务都将使用X协议。

    1.4K20
    领券