首页 游戏 软件 资讯 排行榜 专题
首页
数据库
mysql为什么RC级别在高并发下更受欢迎_分析其对死锁与并发的优化

mysql为什么RC级别在高并发下更受欢迎_分析其对死锁与并发的优化

热心网友
38
转载
2026-05-04

RC降低死锁概率的根本原因是默认不使用间隙锁,仅对命中行加记录锁,锁范围更小、冲突更少;而RR对范围条件自动加Next-Key锁,易引发循环等待死锁。

mysql为什么RC级别在高并发下更受欢迎_分析其对死锁与并发的优化

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

RC 隔离级别为什么能降低死锁概率

说到底,RC级别降低死锁概率的核心秘诀,就在于它“不轻易动用”间隙锁(Gap Lock)——除了检查唯一键或外键冲突这类少数特定场景。对比之下,在RR级别里,一句 UPDATE WHERE age > 25 这样的范围更新,InnoDB会默认加上Next-Key Lock(记录锁+间隙锁),把整个区间都锁住。而在RC级别下,它只锁定实际被修改的那些行,锁的范围大大缩小,事务之间“撞车”的可能性自然就降低了。

一个典型的死锁链条是这样的:事务A锁住了(10, 20)这个间隙,事务B锁住了(20, 30)这个间隙,然后它们都试图往中间插入一条id=25的记录,结果就是互相等待,直接卡死。但在RC级别下,这些间隙本身不会被锁定,不同事务的插入意向锁(Insert Intention Lock)之间是兼容的,因此这类因争夺“空隙”而引发的循环等待,基本可以避免。

几个关键差异,可以这样理解:

  • 在RR级别下,执行SELECT ... FOR UPDATE或带范围条件的UPDATE时,InnoDB会自动升级为Next-Key Lock。
  • 而在RC级别下,执行同样的SQL,通常只加记录锁(Record Lock)。当然,如果涉及唯一索引冲突检查,它仍然会加S型的Next-Key Lock来做重复性校验。
  • RC级别还能减少MVCC版本链的维护开销,尤其是在写多读少的场景里,undo log的清理压力会更小一些。
  • 最后要提醒一点:间隙锁缺失不等于完全没有锁。遇到外键约束或者唯一键冲突检测时,Gap Lock依然会被触发,这个细节常常被忽略。

RC 下 INSERT 死锁的真实诱因

很多人可能以为,切换到RC级别就彻底告别INSERT死锁了,其实不然。真正的陷阱,往往藏在唯一键冲突和主键冲突的锁行为里——在这些场景下,RC和RR的加锁策略是一致的。

举个例子,两个事务并发执行这样一条语句:

INSERT INTO users (id, email) VALUES (100, 'a@b.com');

如果email字段是唯一索引,并且表中已经存在一条email='a@b.com'的记录,那么两个事务都会尝试对这条已存在的记录加上S型的Next-Key Lock(目的是做冲突检测)。紧接着,它们又都会试图插入自己的新行,这就形成了X锁与S锁的互斥,死锁一触即发。

这里有几个关键点需要把握:

  • 使用INSERT ... ON DUPLICATE KEY UPDATE时,如果发生唯一键冲突,它会加X型的Next-Key Lock,在RC级别下同样可能引发死锁。
  • REPLACE INTO的行为更激进:它会在冲突记录以及它的下一条记录上都加上Next-Key Lock。
  • 即使没有显式地开启事务,单条INSERT语句本身也会开启一个隐式事务,锁要等到语句结束时才释放。
  • 如果一个没有索引的列被用来做唯一性判断?那情况会更糟,查询会退化为全表扫描并加上大量的记录锁,死锁风险反而可能更高。

RC 配置后为什么业务还出问题

配置了RC但业务依然出问题,最常见的原因其实是连接池或者ORM框架没有让配置真正生效。要知道,MySQL的默认隔离级别是RR,很多Ja va应用使用HikariCP配合MyBatis,连接从连接池取出后,其隔离级别可能依然沿用服务端的默认值,那条关键的SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED语句并没有被执行。

如何验证配置是否真的生效了呢?可以试试这几个方法:

  • 在连接建立后,立刻执行SELECT @@transaction_isolation进行查看。注意,要看的是会话级变量,而不是全局变量@@global.transaction_isolation
  • 检查慢查询日志,看看里面是否还有SELECT ... LOCK IN SHARE MODE这类语句。这类语句在RC下虽然不加Gap Lock,但如果没有显式地以BEGIN开启事务,它可能会按照会话的默认隔离级别(可能还是RR)来执行。
  • binlog格式必须设置为ROW,否则在RC级别下可能导致主从数据不一致。如果使用STATEMENT格式,RC下那些非确定性的语句将无法在从库正确重放。
  • Spring框架的@Transactional(isolation = Isolation.READ_COMMITTED)注解通常是有效的,但需要确认数据源本身的配置没有覆盖这个设置。

RC 不是银弹:哪些场景它反而更危险

必须清醒地认识到,RC并非万能解药,在某些场景下它反而会带来更大的风险。最典型的就是“先查询,后修改”这类业务逻辑。

以库存扣减为例:先执行SELECT stock FROM goods WHERE id = 123得到库存10,再执行UPDATE goods SET stock = 9 WHERE id = 123 AND stock >= 10。在RC级别下,这两个操作之间的时间窗口,其他事务可能已经把库存改成了9,最终导致超卖。

这时,你不得不借助SELECT ... FOR UPDATE来加锁。但问题在于,RC下的SELECT ... FOR UPDATE只锁行,不锁间隙。如果业务逻辑本身允许“幻读”(即允许在事务期间插入新记录),那没问题;但如果需要防止新记录的插入干扰判断(例如,防止在事务期间新增一个同规格的商品),RC就无能为力了。

还有一些容易被忽略的细节:

  • RC下,SELECT ... FOR UPDATE不会阻塞其他事务在相邻间隙中插入数据,所以如果业务需要“防止插入”,必须依靠应用层逻辑或数据库的唯一约束来兜底。
  • 长事务在RC级别下依然危险:虽然MVCC快照的维护开销较轻,但未提交的事务仍然会阻止purge线程清理undo log,长时间积累可能导致ibdata1文件膨胀。
  • 某些ORM框架自动生成的批量更新语句,即使在RC下,也可能因为where条件的顺序不一致,导致加锁顺序不同,从而引发死锁。

说到底,决定是否采用RC级别的关键,并不在于抽象的并发数字高低,而在于业务本身能否容忍不可重复读和幻读现象,以及开发团队是否有能力将核心的校验逻辑,收敛到单条具备原子性的SQL语句中去完成。

来源:https://www.php.cn/faq/2419345.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

mysql8.0索引跳跃扫描如何使用_优化联合索引非首列查询
数据库
mysql8.0索引跳跃扫描如何使用_优化联合索引非首列查询

MySQL 8 0 索引跳跃扫描:一个被误解的“优化捷径” 提到MySQL 8 0的索引跳跃扫描(Index Skip Scan),很多人的第一反应是:“终于可以不用管联合索引最左前缀原则了!” 但事实果真如此吗?先泼一盆冷水:它并非一个可以随意开关的“万能钥匙”,而是优化器在特定场景下才会动用的“

热心网友
05.04
mysql为什么RC级别在高并发下更受欢迎_分析其对死锁与并发的优化
数据库
mysql为什么RC级别在高并发下更受欢迎_分析其对死锁与并发的优化

RC降低死锁概率的根本原因是默认不使用间隙锁,仅对命中行加记录锁,锁范围更小、冲突更少;而RR对范围条件自动加Next-Key锁,易引发循环等待死锁。 RC 隔离级别为什么能降低死锁概率 说到底,RC级别降低死锁概率的核心秘诀,就在于它“不轻易动用”间隙锁(Gap Lock)——除了检查唯一键或外键

热心网友
05.04
mysql如何查看索引的使用率_通过sys库分析冗余索引
数据库
mysql如何查看索引的使用率_通过sys库分析冗余索引

MySQL索引使用率:一个被过度简化的伪命题 在数据库优化的讨论中,“索引使用率”常常被当作一个关键指标。但这里有个根本性的认知偏差:MySQL本身并不提供,也计算不出一个精确的“索引使用率”百分比。 市面上有些工具或文章,试图用sys库视图的数据做除法,得出诸如“某索引使用率95%”的结论,这种做

热心网友
05.04
mysql5.7与8.0的默认字符集有何改变_utf8mb4默认值与排序规则
数据库
mysql5.7与8.0的默认字符集有何改变_utf8mb4默认值与排序规则

MySQL 5 7 到 8 0 升级:字符集与排序规则的“暗礁”与避坑指南 先明确一个核心事实:从 MySQL 5 7 升级到 8 0,字符集和排序规则的默认设置发生了根本性改变。这绝非一个简单的版本号变化,而是一个可能直接导致数据乱码、查询异常甚至业务逻辑错误的“硬切换”。 MySQL 5 7 和

热心网友
05.04
mysql如何处理慢查询日志_slow_query_log开启与pt工具分析
数据库
mysql如何处理慢查询日志_slow_query_log开启与pt工具分析

慢查询日志:从开启到分析,避开那些“开了等于没开”的坑 想优化数据库性能,慢查询日志是绕不开的起点。但这里有个常见的误区:你以为开启了全局日志就万事大吉?如果关键的阈值没设对,很可能跑上一天也抓不到一条有效记录。而在分析工具的选择上,pt-query-digest凭借其SQL归一化、细粒度指标分析和

热心网友
05.04

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

wf-1000xm4蓝牙配对需要按哪个键?
电脑教程
wf-1000xm4蓝牙配对需要按哪个键?

WF-1000XM4蓝牙配对指南:两种触发路径,一个核心逻辑 给索尼WF-1000XM4配对,核心其实就一件事:让耳机进入“被发现”的状态。有意思的是,它并不依赖某个单一的物理按键,而是提供了双路径的触发方式。根据官方的操作指南以及多次的实际测试,无论是通过充电盒上的功能键,还是直接操作耳机本身,都

热心网友
05.04
迅捷路由器桥接教程详细常见失败原因有哪些?
电脑教程
迅捷路由器桥接教程详细常见失败原因有哪些?

迅捷路由器桥接失败怎么办?原因分析与解决方法大全 许多用户在使用迅捷路由器进行无线桥接时,经常遇到“显示已连接但无法访问互联网”的问题。实际上,这通常并非设备故障,而是由于关键的网络参数配置不当或主副路由器之间的通信协调不畅所致。简单来说,就是两台路由器之间的设置没有完全匹配。那么,具体哪些环节最容

热心网友
05.04
迅捷路由器桥接教程详细包括手机设置吗?
电脑教程
迅捷路由器桥接教程详细包括手机设置吗?

迅捷路由器无线桥接:手机端设置实操指南 使用手机为迅捷路由器配置无线桥接(WDS),听似专业,实则通过官方适配的移动端界面就能轻松完成。只要满足几个关键条件,您仅需一部手机即可高效架设扩展网络。操作时,请先将手机连接至副路由器的默认无线信号(通常以FAST_XXXX格式命名),随后在Safari或C

热心网友
05.04
小米空调联网失败怎么办?
电脑教程
小米空调联网失败怎么办?

小米空调联网故障全解析:从新手排查到专家级修复,步步为营 当小米空调始终无法成功连接网络时,许多用户的第一反应往往是联系售后或怀疑设备故障。然而实际情况是,超过九成的联网失败案例,根源都出在网络配置、操作流程这类“软性”环节,空调硬件本身出问题的概率极低。解决问题的核心在于掌握系统化的排查思路,按照

热心网友
05.04
有线音响改无线蓝牙连接麻烦吗?
电脑教程
有线音响改无线蓝牙连接麻烦吗?

有线音响加装蓝牙功能并不复杂,普通用户借助外置蓝牙接收器即可在十分钟内完成升级 想给家里的老款有线音响“剪掉”那根烦人的音频线?其实这件事没你想的那么复杂。普通用户完全不需要动用电烙铁,借助一个小巧的外置蓝牙接收器,十分钟之内就能搞定升级。核心操作很简单:确认你的音箱背面有标准的3 5毫米或RCA音

热心网友
05.04