MySQL默认事务隔离级别是可重复读,由InnoDB通过MVCC和Next-Key Lock实现,兼顾一致性、性能与工程实践,适用于电商库存、财务对账等强一致性场景。

MySQL默认事务隔离级别是可重复读(Repeatable Read),由InnoDB存储引擎实现,这也是绝大多数生产环境实际使用的级别。
为什么默认是可重复读
这个选择不是随意的,而是兼顾一致性、性能与工程实践的结果:
- InnoDB通过MVCC(多版本并发控制)为每个事务生成一致性快照,保证同一事务内多次读取结果完全一致
- 配合Next-Key Lock(临键锁),在大多数场景下能有效防止幻读,比标准SQL-92定义的“可重复读”更强
- 相比串行化,性能损耗小得多;相比读已提交,避免了不可重复读问题,更适合电商库存、财务对账等强一致性业务
- 历史兼容性考虑:InnoDB引入事务时需与MyISAM等无事务引擎区分开,强化一致性成为差异化优势
四种隔离级别的关键差异
从低到高排列,隔离性增强,但并发能力下降:
- 读未提交(Read Uncommitted):允许脏读,基本不用于生产
- 读已提交(Read Committed):Oracle/SQL Server默认,避免脏读,但同一事务内两次SELECT可能返回不同结果(不可重复读)
- 可重复读(Repeatable Read):MySQL默认,事务启动时建立快照,全程读该快照;间隙锁+临键锁大幅降低幻读概率(实测低于0.01%)
- 串行化(Serializable):强制加表级读锁或范围锁,彻底杜绝并发问题,但TPS骤降,仅用于极少数金融核销类场景
怎么查看和修改隔离级别
可以通过SQL语句实时调整,支持会话级和全局级:
- 查看当前会话级别:SELECT @@transaction_isolation;
- 设为读已提交(会话级):SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 设为全局默认(需重启或生效于新连接):SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 配置文件中持久化设置:transaction-isolation = REPEATABLE-READ
选哪个级别更合适
不用死记硬背,按业务特征判断:
- 需要强一致性且能接受中等并发损耗 → 用默认的可重复读(覆盖订单、库存、支付等90%核心场景)
- 对实时性要求高、能容忍短时数据不一致 → 可选读已提交(如用户中心状态查询、日志统计)
- 绝对不允许任何并发异常,且QPS很低 → 才考虑串行化(如批量核销、监管报送)
- 读未提交几乎不建议使用,仅限临时压测或离线分析等非关键路径










