当前位置: 首页 > news >正文

RC和RR的区别

以下是结合你新增需求(RC 隔离级别对 undo log 空间占用的影响)完善后的 MySQL RC 与 RR 隔离级别对比分析,涵盖日志机制、间隙锁设计及 undo 资源管理:


⚙️ 一、核心区别总结

特性RC (READ-COMMITTED)RR (REPEATABLE-READ)
不可重复读✅ 可能发生❌ 禁止
幻读✅ 可能发生❌ 禁止(通过间隙锁 + MVCC)
加锁范围仅锁定存在的记录记录锁 + 间隙锁(Gap Locks)
一致性快照每条语句独立快照事务开始时创建快照
Undo Log 占用⭐ 占用少(语句级快照,及时清理)⚠️ 占用多(事务级快照,长期保留)
Binlog 兼容性需配合 ROW 格式兼容 STATEMENT 格式

🔍 二、Undo Log 机制与空间占用差异

1. MVCC 依赖的版本链
  • 所有修改(INSERT/UPDATE/DELETE)均生成 undo log,用于构建数据的“历史版本链”。
  • 通过隐藏字段 DB_ROLL_PTR 指向 undo log,实现多版本访问。
2. RC 级别:Undo 空间占用更低
  • 原因:每条 SELECT 语句创建独立快照(ReadView),语句结束后即可释放不再需要的旧版本 undo log
  • 回收机制:Purge 线程可快速清理已提交事务的 undo 记录,减少空间积压。
  • 影响:高并发场景下,undo 表空间增长更平缓,降低空间压力。
3. RR 级别:Undo 空间占用更高
  • 原因:事务开始时创建唯一快照(ReadView),整个事务期间必须保留所有关联的 undo log 以维持一致性视图。
  • 长期保留:即使数据已提交,只要事务未结束,其修改前的版本仍可能被当前事务访问,无法释放。
  • 风险:长事务或大事务易导致 undo 表空间膨胀,需依赖 innodb_undo_log_truncate 定期回收(默认超 1GB 触发)。

💡 优化建议
RR 级别需监控 INFORMATION_SCHEMA.INNODB_METRICS 中的 undo truncation 频率,避免空间不足导致事务失败。


📜 三、Binlog 与事务日志协同

场景RC + STATEMENT BinlogRR + STATEMENT Binlog
主从一致性⚠️ 数据不一致风险(幻读复制)✅ 安全(可重复读保证)
解决方案必须使用 binlog_format=ROW兼容任意 Binlog 格式

Group Commit 机制
RC/RR 均通过 Binlog 和 Redo Log 的“三阶段提交”(Flush → Sync → Commit)保证持久性,且 Redo Log 记录 Undo Log 的修改,确保崩溃恢复一致性。


🔒 四、间隙锁(Gap Locks)关键差异

RR 级别
  1. 作用范围
    • 锁索引记录间的“间隙”(如 id BETWEEN 5 AND 10),阻止范围内插入。
    • 通过 Next-Key Lock(Record Lock + Gap Lock)解决幻读。
  2. 加锁逻辑
    UPDATE t SET name='a' WHERE id > 5 AND id < 10; -- 锁住 (5,10) 区间
    
RC 级别
  1. 无间隙锁
    • 仅锁实际存在的记录,允许其他事务在范围内插入新数据。
  2. 性能优势
    • 减少锁竞争,降低死锁概率(如全表扫描时,RR 会锁全表,RC 仅锁匹配行)。

⏱️ 五、MVCC 实现与 ReadView 生成

行为RCRR
ReadView 创建时机每条 SELECT 语句开始时事务第一条 SELECT 开始时
可见性判断总是读取最新已提交数据读取事务开始时的快照数据
活跃事务列表每次语句重建事务内复用

示例

-- 事务A(RC级别):
SELECT * FROM t;  -- 返回 R1(最新已提交数据)
COMMIT;           -- 事务B提交 UPDATE
SELECT * FROM t;  -- 返回 R2(含B的修改)-- 事务A(RR级别):
SELECT * FROM t;  -- 返回 R1
COMMIT;           -- 事务B提交 UPDATE
SELECT * FROM t;  -- 仍返回 R1(忽略B的修改)

🛠️ 六、选型建议与典型场景

场景推荐隔离级别关键依据
高并发写入/更新✅ RC无间隙锁竞争,Undo 空间占用低
财务/账户一致性操作✅ RR避免幻读,Binlog 兼容性好
逻辑备份(mysqldump)✅ RRWITH CONSISTENT SNAPSHOT 一致性
SSD 存储受限环境✅ RCUndo 空间回收高效,减少 I/O 压力

💎 总结:核心差异与优化方向

维度RCRR
数据一致性语句级一致事务级一致
锁开销低(无间隙锁)高(Next-Key Lock 范围锁)
Undo 空间⭐ 占用少,回收快⚠️ 占用多,长事务易堆积
适用 Binlog强制 ROW 格式支持 STATEMENT/ROW 格式

💎 终极建议

  • 选 RC:优先考虑 OLTP 系统(如电商订单),平衡性能与一致性,需配合 binlog_format=ROW
  • 选 RR:需严格事务一致性(如银行转账),或使用 STATEMENT 格式 Binlog 的主从架构。
  • 治理长事务:RR 下监控 SELECT ... FOR UPDATE 和执行时间,避免 undo 空间持续增长。
http://www.lryc.cn/news/611456.html

相关文章:

  • 一文搞定JavaServerPages基础,从0开始写一个登录与人数统计页面
  • Python 函数详解
  • SpringCloud学习------Hystrix详解
  • 通俗版23种设计模式解析
  • 苍穹外卖Day10
  • 智慧酒店:科技赋能下的未来住宿新体验
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • 山东省天地图API申请并加载到QGIS和ArcGIS Pro中
  • 数据结构 实现单链表
  • LeetCode347.前K个高频元素(hash表+桶排序)
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 思途Mybatis学习 0805
  • LeetCode 刷题【31. 下一个排列】
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • 【C语言】动态内存管理详解
  • Kafka 的基本操作(1)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • 【java】大数据insert的几种技术方案和优缺点
  • 一种基于机器学习的关键安全软件WCET分析方法概述与实际工作原理举例
  • 多传感器融合
  • 机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利
  • nodejs 编程基础01-NPM包管理
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • 【android bluetooth 协议分析 01】【HCI 层介绍 30】【hci_event和le_meta_event如何上报到btu层】
  • 零基础人工智能学习规划之路
  • 电路基础相关知识
  • HBM Basic(VCU128)
  • 翻译的本质:人工翻译vs机器翻译的核心差异与互补性