跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL 事务深度解析:ACID 特性与隔离级别实战

MySQL 事务是保障数据可靠性的核心机制,具备 ACID 四大特性。InnoDB 引擎支持事务,MyISAM 不支持。事务提交分为自动和手动两种模式。隔离级别包括读未提交、读提交、可重复读(MySQL 默认)和串行化,不同级别解决脏读、幻读等并发问题。MVCC 技术通过多版本控制实现读写不阻塞。掌握事务操作如 begin、commit、rollback 及保存点管理,能有效防止数据丢失和并发冲突,确保系统数据一致性。

1qazxsw2发布于 2026/3/21更新于 2026/6/325 浏览
MySQL 事务深度解析:ACID 特性与隔离级别实战

文章配图

文章配图

一、事务介绍

事务是一组 DML 相关的语句集合,这些指令要么全部成功,要么全部失败,满足如下性质:

  • 原子性(Atomicity):操作不可分割,要么全成要么全败。
  • 一致性(Consistency):事务前后数据库完整性不被破坏。
  • 隔离性(Isolation):并发事务互不干扰,避免脏读、幻读等问题。
  • 持久性(Durability):事务提交后,数据修改永久有效。

二、为什么要有事务

事务是为了服务应用层而存在。数据库是存储数据的地方,应用层对数据进行的操作必须保障数据的一致性。这些关注点(如修改是否成功、数据是否会丢失)应交由 MySQL 自行实现,因此它是一个服务机制。

三、事务的版本支持

在 MySQL 中,只有使用了 InnoDB 数据库引擎的数据库或表才支持事务,MyISAM 不支持。

mysql> show engines;          -- 表格显示
mysql> show engines \G;       -- 行显示

文章配图 文章配图

四、事务提交的两种方式

事务的提交方式常见的有两种:自动提交和手动提交。

查看事务提交方式:

show variables like 'autocommit';

文章配图

用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0;   # 禁止自动提交
SET AUTOCOMMIT=1;   # 开启自动提交

文章配图

五、事务的几种操作

(1)开始一个事务

begin;

(2)创建一个保存点

savepoint 自命名;

文章配图

(3)回滚到指定保存点

rollback to 保存点名字;

文章配图

(4)正常结束一个事务

注意:正常结束一个事务后,不支持回滚。

commit;

文章配图

(5)异常结束一个事务

注意:异常结束自动回滚,由于原子性,自动回到事务未提交时的数据状态。

六、事务隔离级别

(1)读未提交

在该隔离级别,所有的事务都可以看到其他事务没有执行的执行结果。实际生产中不可能使用这种隔离级别,因为它没有任何隔离性,会有脏读、幻读、不可重复读等并发问题。

理解:假设多个客户端并发访问操作同一个数据,单个客户端的任何操作不管提交与否,其他人看得到。

总结:不管对方提交与否,都看得到数据的修改。

(2)读提交

该隔离级别是大多数数据库默认的隔离级别(不是 MySQL 默认)。它满足隔离的简单定义:一个事务只能看到其他已经提交的事务所做的改变。这种隔离级别会引起不可重复读,即一个事务执行时,如果多次 SELECT,可能得到不同的结果。

理解:假设 A 在操作一个事务,B 也在操作一个事务。A 和 B 都在修改表 1,A 在执行 COMMIT 之前,B 是看不到 A 做出的修改的。一旦 A 做出了提交,B 就可以看到 A 的修改。

总结:只要对方提交了,哪怕是多个事务,数据修改就会被其他人看到。

(3)可重复读

这是 MySQL 默认的隔离级别,它确保同一个事务在执行中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题!

理解:假设 A 在操作一个事务,B 也在操作一个事务。A 和 B 如果操作同一个表,此时 A 完成了提交,B 是看不到修改的,B 看到的是 B 进入该事务开始时的数据。如果 A 退出事务了,那么 B 的数据就会更新到最新的。

总结:只有单方提交且退出事务,对方才看得到更改。

什么是幻读?假设 A 修改了张三的年龄,然后提交退出事务,B 此时可能在筛选年龄时出现两个张三,因为 A 提交且退出事务了,B 就会更新数据。

(4)串行化

这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁!

总结:一把锁,你访问数据是没有问题的,当你修改数据时,只有在你前一个事务修改完了你才可以执行修改的操作,即串行化,唯一就是效率低。

七、事务相关结论

  1. 持久化保障:只要开始一个事务,输入 BEGIN 或者 START TRANSACTION,事务便必须要通过 COMMIT 提交,才会持久化,与是否设置自动提交无关。
  2. 事务可以手动回滚,同时,当操作异常,MySQL 会自动回滚。

以上可以看出事务的原子性和持久性:要么成功要么不成功,数据一经提交,就是持久化。而原子性保障了数据的一致性。

八、修改事务隔离级别

  • 读未提交:SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  • 读提交:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • 可重复读(默认):SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  • 串行化:SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

九、客户端会话与事务关系

客户端会话并非是一个事务,一个客户端中可以允许多个事务,事务之间相互独立。

十、进阶:数据并发的场景

数据并发场景有以下三种:

  • 读 - 读:不存在任何问题,也不需要并发控制。
  • 读 - 写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、幻读、不可重复读。
  • 写 - 写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失。

多个用户访问同一块数据不存在安全问题,因为只访问不修改。

读 - 写

用来解决读 - 写的方案:多版本并发控制(MVCC)(无锁并发控制)。

解决问题:读写互不阻塞。

如何解决?

MVCC 依靠三个工具:

  1. 数据的额外三个标签:最近修改的事务 ID、回滚指针、隐式主键。
  2. 快照仓库(针对写操作):当修改数据时会保存一份原始数据在 undo 日志里面,回滚指针指向该原始数据。
  3. 读视图(针对读操作):形成读视图,给当前事务划分可见范围,看不到未提交的或者在你后面提交的数据版本。

运行过程:当 A 去修改数据时,会加行锁(保证修改的原子性),先将原始数据放在 undo 仓库。如果有读端访问,访问的是 undo 仓库里面的,看不到 A 的修改,因为有视图范围,读写可以同时进行。视图通过划分范围可以自行屏蔽脏读——四种隔离性无非是对这三个工具'度'的把控。

目录

  1. 一、事务介绍
  2. 二、为什么要有事务
  3. 三、事务的版本支持
  4. 四、事务提交的两种方式
  5. 五、事务的几种操作
  6. (1)开始一个事务
  7. (2)创建一个保存点
  8. (3)回滚到指定保存点
  9. (4)正常结束一个事务
  10. (5)异常结束一个事务
  11. 六、事务隔离级别
  12. (1)读未提交
  13. (2)读提交
  14. (3)可重复读
  15. (4)串行化
  16. 七、事务相关结论
  17. 八、修改事务隔离级别
  18. 九、客户端会话与事务关系
  19. 十、进阶:数据并发的场景
  20. 读 - 写
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 滑动窗口实战:长度最小的子数组与无重复字符的最长子串
  • GitHub Copilot Pro 学生认证与配置教程
  • Stable Diffusion WebUI 无障碍改造:键盘导航与屏幕阅读器适配
  • 大模型落地应用的关键基础设施与行业实践
  • 2026 年各大高校 AIGC 检测政策汇总
  • Claude Code 替代方案:OpenCode 搭配 GitHub Copilot
  • PHP 接口开发:XML 数据的生成与解析实战
  • RAG 结合内容推荐的实践方案与代码示例
  • Spring Bean 作用域、生命周期与自动装配源码解析
  • 偏好对齐技术:通用模型蒸馏、领域模型蒸馏与自我提升
  • STM32 上运行 AI 大模型的四种方案及案例
  • 使用 MCP-Server 插件将 Dify 工作流发布为第三方服务
  • 移动端部署 Stable Diffusion 开源方案与使用指南
  • HarmonyOS 应用升级:静默登录与端云一体实战
  • 基于 SpringBoot2+Vue3 的大学生科创项目在线管理系统
  • MaxKB4j 开源智能体搭建平台技术详解
  • Meta Llama 系列深度解析:开源大模型事实标准与架构演进
  • Stable Diffusion 报错修复:CheckpointLoaderSimple 模型加载失败处理
  • 数据结构:选择排序与堆排序原理及实现
  • JavaSE 核心知识点整理

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online