当前位置: 首页 > 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.dtcms.com/a/316805.html

相关文章:

  • Pytorch实现婴儿哭声检测和识别
  • 【web自动化测试】实战
  • Coze Studio开源,企业用户多了一种选择,也需多几分考量
  • 如何通过 5 种方式将照片从 iPad 传输到电脑
  • 埋点技术进阶:如何构建高效的数据采集架构
  • 默认二级路由(React-Router 6)
  • linux-系统日志查看指令systemctl
  • 《方块34:金花之渊》
  • Linux 常用命令大全
  • C++ 拷贝赋值、swap 与 noexcept 深度解析:高效实现 operator=
  • 工业数采引擎-通信链路SOCKET
  • Python高级编程与实践:Python网络编程基础与实践
  • Linux的NFS与Autofs配置指南
  • mac安装pycharm
  • 2048小游戏
  • VUE2 学习笔记 合集
  • 如何在nuxt项目中使用axios进行网络请求?
  • 【STM32】HAL库中的实现(三):PWM(脉冲宽度调制)
  • C语言线程同步详解(互斥锁、信号量、条件变量和读写锁)
  • GPU 安装
  • 前端包管理器深度对比
  • 双模对讲机是什么意思?与模拟/数字对讲机有什么区别?
  • 使用 ECharts 实现小区住户数量统计柱状图
  • Leetcode-2080区间内查询数字的频率
  • Spring AI 系列之三十六 - Spring AI Alibaba-nl2sql
  • 02--类和对象
  • 大厂面试题
  • React在使用create-react-app创建项目慢的解决办法
  • TanStack React Query 完全指南:从0到精通
  • Flux.1系列模型解析--Flux.1 Tools