news 2026/7/5 16:19:53

MySQL 事务隔离级别与 MVCC 深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 事务隔离级别与 MVCC 深度解析

引言

从并发问题出发,彻底理解 MySQL 为什么这样设计事务隔离

一、为什么需要事务隔离级别?

在并发数据库系统中,多个事务同时读写同一份数据是常态。如果不加任何控制,就会引发各种数据一致性问题,例如:

  • 一个事务读到了另一个事务尚未提交的数据
  • 同一事务中,两次查询结果不一致
  • 查询过程中“凭空多出”一些记录

这些问题统称为并发读问题,而事务隔离级别(Isolation Level),正是数据库在「性能」和「一致性」之间做出的不同权衡方案。

二、MySQL 支持的四种事务隔离级别

SQL 标准定义了四种隔离级别,MySQL(InnoDB)全部支持。

读未提交(Read Uncommitted)

特点
  • 一个事务可以读到另一个事务尚未提交的数据
问题
  • 脏读(Dirty Read)
示例
事务A:update account set balance = 0 where id = 1; (未提交) 事务B:select balance from account where id = 1; → 读到 0 事务A:rollback;

B 读到的数据是从未真正存在过的

评价
  • 几乎不加任何隔离
  • 实际生产环境基本不用

读已提交(Read Committed)

Oracle 的默认隔离级别

特点
  • 只能读到已提交的数据
  • 每次查询都会读取最新已提交版本
解决的问题
  • 避免脏读
仍然存在的问题
  • 不可重复读(Non-repeatable Read)
示例
事务A:select balance → 100 事务B:update balance = 200; commit; 事务A:select balance → 200

同一个事务中,两次读取结果不同

可重复读(Repeatable Read)⭐

MySQL InnoDB 默认隔离级别

特点
  • 同一个事务中,多次读取同一行记录结果一致
  • 基于MVCC(多版本并发控制)
能解决的问题
  • 脏读
  • 不可重复读
可重复读下,事务 A 提交的数据,事务 B 能看到吗?

分两种情况:

情况一:普通快照读(一致性读)
select * from table;
  • 看不到
  • 使用事务开始时生成的 Read View
情况二:当前读(锁定读)
select * from table for update; select * from table lock in share mode;
  • 可以看到
  • 直接读取最新版本

这正是 MySQL 可重复读与其他数据库的核心区别之一

串行化(Serializable)

特点
  • 所有事务串行执行
  • 强制加锁(行锁 / 表锁)
实现方式
  • 一种实现方式:读操作也加行级锁
  • 完全避免并发问题
缺点
  • 并发性能极差
  • 几乎不用于高并发系统

三、可重复读真的解决了幻读吗?

什么是幻读(Phantom Read)?

事务A:select count(*) from orders where price > 100; 事务B:insert into orders values (..., price=200); commit; 事务A:再次 select count(*) → 结果变多

多出“幻影行”

MySQL 的“特殊之处”

严格来说:

可重复读 + MVCC 并不能完全解决幻读

  • MVCC 只能保证已存在记录的版本一致
  • 对于新插入的记录,MVCC 无能为力

MySQL 如何“防止幻读”?

方案一:锁定读(推荐)
select * from orders where price > 100 for update;
  • 会加Next-Key Lock(记录锁 + 间隙锁)
  • 锁住一个范围
  • 阻止其他事务插入新记录

从结果上看:幻读被避免

方案二:串行化隔离级别
  • 本质是用锁解决
  • 代价太高

四、MVCC:多版本并发控制的核心原理

MySQL 高并发性能的关键

MVCC 解决了什么问题?

  • 避免读写冲突
  • 提高并发性能
  • 实现非阻塞读

MVCC 的核心组件

(1)隐藏字段
  • trx_id:最后一次修改该行的事务 ID

  • roll_pointer:指向 undo log

(2)Undo Log
  • 保存数据的历史版本

  • 用于事务回滚 & MVCC

(3)Read View
  • 决定“当前事务能看到哪些版本”

一致性读流程(简化)

当前事务 → 生成 Read View → 判断记录 trx_id 是否可见 → 不可见 → 通过 undo log 找历史版本

MVCC + 锁的协作关系

场景机制
普通 selectMVCC
select for updateUpdate
update / delete
防止幻读Next-Key Lock

MVCC 解决“读一致性”,锁解决“写冲突”

总结

MySQL 默认使用可重复读隔离级别

MVCC 保证了:

  • 非阻塞读
  • 高并发性能

幻读并不是完全由 MVCC 解决

锁定读 + Next-Key Lock才是幻读的真正终结者

MySQL 的事务模型,本质是:

MVCC + 锁机制的精妙组合

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 5:22:00

快速掌握时序数据库 + TDengine 学习指南

1. 时序数据库核心认知 数据特征:高写入吞吐、时序有序性、保留期(TTL)、降采样与压缩、插值与对齐、窗口聚合。典型场景:物联网传感器、工业监控、日志/指标(Metrics)、金融行情、车联网。关键能力评估维度:写入性能…

作者头像 李华
网站建设 2026/6/26 8:11:14

数据挖掘在零售行业的实战案例

数据挖掘在零售行业的实战案例 关键词:数据挖掘、零售行业、客户分群、精准营销、库存优化、销售预测、实战案例 摘要:本文深入探讨数据挖掘技术在零售行业的核心应用场景,通过四个完整实战案例(客户分群、精准营销、库存优化、销售预测)解析关键技术路径。结合K-means聚类…

作者头像 李华
网站建设 2026/7/1 11:17:41

TensorRT与OpenTelemetry集成实现分布式追踪

TensorRT与OpenTelemetry集成实现分布式追踪 在当今的AI生产系统中,一个模型“跑得快”已经不再是唯一的追求。更关键的问题是:当整个推理链路出现延迟抖动或性能退化时,我们能否快速定位问题?是在预处理卡住了,还是GP…

作者头像 李华
网站建设 2026/6/26 8:39:32

转行AI大模型算法工程师,如何在人工智能领域实现职业跃迁

AI大模型算法工程师行业概况 在人工智能技术飞速发展的今天,AI大模型算法工程师成为了推动行业创新的关键力量。该领域涵盖了深度学习、自然语言处理、计算机视觉等多个方向,广泛应用于互联网、金融、医疗、教育等领域。AI大模型算法工程师不仅需要具备扎…

作者头像 李华
网站建设 2026/7/1 23:34:57

Java程序员转行大模型开发指南,附学习资源,必收藏!_2025最新程序员转行AI大模型教程(非常详细)

本文为Java程序员提供大模型开发转型指南,涵盖基础知识学习、工具掌握、编程提升、数学储备和实践步骤。分析Java程序员转行优势,详解AI大模型时代的新技术岗位及所需知识体系,并提供系统化学习路线与资源,助力程序员抓住AI时代机…

作者头像 李华