MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

MySQL InnoDB 默认事务隔离级别是 RR(可重复读 Repeatable Read)

为什么MySQL默认选用RR,而不是RC

  1. 防止主从复制出现数据不一致(历史核心原因)
    早期MySQL版本,binlog只支持statement格式。
    statement格式记录原始SQL语句,主库RC隔离级别下,如果事务执行顺序不同,从库回放SQL,执行结果和主库不一致,造成主从数据错乱。
    RR隔离级别可以规避这个statement模式下的主从同步bug。

现在有row格式binlog可以解决该问题,但历史原因保留RR作为默认。

  1. 保证同一个事务内部数据快照一致性

    RR级别下,整个事务看到的是统一数据快照,事务内部多次查询,结果保持不变,不会受到其他事务提交修改的干扰,不会出现不可重复读 。

    业务中很多场景,同一个事务多次查询同一份数据,希望前后读取结果一致,RC会出现前后读取不一样的现象。

  2. InnoDB在RR下解决了幻读问题

    SQL标准里RR是会存在幻读的,但是InnoDB通过 MVCC多版本控制 + 临键锁(Next‑Key Lock) ,在RR隔离级别解决了幻读。

    相当于在这个隔离级别,既拿到不错的隔离效果,又不用直接上串行化牺牲大量并发性能。

  3. 平衡一致性与并发性能

    比RC隔离级别更高的数据一致性;对比Serializable串行化,不会完全锁死并发,性能远好于串行化,做到一致性和性能折中。

补充:互联网业务为什么很多会改成RC

RC读已提交也有优势:

  1. RC没有间隙锁,只有行锁,锁范围更小,锁冲突变少,并发更高;
  2. 避免RR下间隙锁带来的死锁问题;
  3. 现在线上binlog普遍使用row行格式,不再有早期statement主从不一致的问题,所以很多公司业务主动修改为RC。

总结:

MySQL InnoDB默认隔离级别是可重复读RR。最初主要为了解决statement格式binlog主从复制不一致;同时事务内多次查询数据保持一致,并且InnoDB通过MVCC+临键锁解决幻读,在一致性和并发之间做了很好平衡。现在很多互联网项目会主动调整为RC,获取更高并发。

相关推荐
时间的拾荒人3 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
隔窗听雨眠3 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
Decay__4 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行3505 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
星恒随风9 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
无奈笑天下10 小时前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
xiaoye-duck11 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
AllData公司负责人12 小时前
AI大模型数据开发底座系列说明书:AllData集成DB-GPT开源项目建设 AI 多模态分析底座,涵盖模态解析/智能大屏/MCP 扩展!
大数据·数据库·人工智能·gpt·数据采集·数据接入·模态解析
隔窗听雨眠12 小时前
MySQL进程卡死的定位思路与恢复实践
mysql·故障排查·数据库运维
2601_9679873712 小时前
Sqlite参考手册
数据库·python·sqlite·api·教程