news 2026/11/1 5:13:26

MySQL事务核心知识大全

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL事务核心知识大全

🔥 MySQL事务核心知识大全

📖 什么是事务?

事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销,即这些操作要么同时成功,要么同时失败。

-- 银行转账示例BEGIN;UPDATEaccountSETbalance=balance-100WHEREid=1;-- 扣钱UPDATEaccountSETbalance=balance+100WHEREid=2;-- 加钱COMMIT;-- 要么都成功-- ROLLBACK; -- 要么都失败

🎯 ACID四大特性

特性中文一句话解释生活类比
Atomicity原子性要么全做,要么全不做转账:扣钱和加钱必须一起完成
Consistency一致性数据要符合业务规则总金额不变,余额不为负
Isolation隔离性并发执行互不干扰排队取钱,一个接一个
Durability持久性一旦提交,永久生效用笔写在纸上,不会消失

详细解释

🔹 原子性(Atomicity)

事务是不可分割的最小操作单位,要么同时成功,要么同时失败。

-- 如果扣钱成功,加钱失败,整个事务回滚BEGIN;UPDATEaccountSETbalance=balance-100WHEREid=1;-- ✅UPDATEaccountSETbalance=balance+100WHEREid=2;-- ❌ROLLBACK;-- 回到最初状态,钱没丢
🔹 一致性(Consistency)

事务完成时,必须使所有数据都保持一致状态,满足业务规则。

-- 转账前后总金额不变-- 余额不能为负数-- 不能出现“钱凭空消失”的逻辑错误
🔹 隔离性(Isolation)

多个事务并发执行时互不干扰,就像在独立环境中运行。

-- 两个人同时转账,结果要正确-- 不能出现互相影响的情况
🔹 持久性(Durability)

事务一旦提交,数据永久保存,即使系统崩溃也不会丢失。

COMMIT;-- 数据落盘,断电也不怕

🚦 事务隔离级别

1. 四个级别对比

隔离级别中文脏读不可重复读幻读性能
Read Uncommitted读未提交✅✅✅最高
Read Committed读已提交❌✅✅↑
Repeatable Read可重复读❌❌✅↓
Serializable串行化❌❌❌最低

💡MySQL默认隔离级别:Repeatable Read(可重复读)

2. 三种并发问题

📍 脏读

读到其他事务未提交的数据

-- 事务A:修改未提交UPDATEaccountSETbalance=800WHEREid=1;-- 事务B:读到未提交数据SELECTbalanceFROMaccountWHEREid=1;-- 800-- 如果事务A回滚,事务B读到的就是脏数据
📍 不可重复读

同一个事务内,两次读取同一数据,结果不一致

-- 事务A:第一次读SELECTbalanceFROMaccountWHEREid=1;-- 1000-- 事务B:修改并提交UPDATEaccountSETbalance=800WHEREid=1;COMMIT;-- 事务A:第二次读SELECTbalanceFROMaccountWHEREid=1;-- 800-- 同一个事务内两次结果不一样!
📍 幻读

同一个事务内,两次查询,结果集行数不同

-- 事务A:第一次查询SELECT*FROMaccountWHEREbalance>500;-- 3条-- 事务B:插入新数据INSERTINTOaccountVALUES(4,'赵六',600);COMMIT;-- 事务A:第二次查询SELECT*FROMaccountWHEREbalance>500;-- 4条-- 多出来一条"幻影"数据

3. 用生活场景理解

隔离级别微信群聊类比
Read Uncommitted张三打了"我…"还没发出去,你就能看到他在输入
Read Committed张三发出消息你才能看到,但刷新一下,消息可能变了
Repeatable Read你看到的消息始终不变,但可能突然多出一条新消息
Serializable大家排队发言,一个人说完另一个才能说

4. 操作命令

-- 查看当前隔离级别SELECT@@TRANSACTION_ISOLATION;-- 设置当前会话隔离级别SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 设置全局隔离级别SETGLOBALTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 示例:设置为读已提交SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;

⚖️ 隔离级别选择策略

业务场景推荐级别原因
金融转账Serializable必须绝对安全
电商订单Repeatable Read防止重复下单
报表统计Read Committed接受实时变化
日志记录Read Uncommitted性能优先
MySQL默认Repeatable Read平衡性能和安全

⚠️注意:隔离级别越高,数据越安全,但是性能越低


🛠️ 事务操作命令

开启事务

BEGIN;-- 或 START TRANSACTION;

提交事务

COMMIT;

回滚事务

ROLLBACK;

保存点(Savepoint)

SAVEPOINTsp1;-- 设置保存点-- 一些操作...ROLLBACKTOsp1;-- 回滚到保存点

📊 MySQL优化策略

1. 索引优化

-- 为经常查询的字段建索引CREATEINDEXidx_balanceONaccount(balance);

2. 分库分表

-- 水平分表:按用户ID取模-- user_0, user_1, user_2, user_3...-- 垂直分表:按字段拆分-- user_base(id, name) 基础信息表-- user_detail(id, address, phone) 详细信息表

3. 读写分离

主库:写操作 从库:读操作 减轻数据库压力

4. 连接池配置

# 连接池参数调优maximum-pool-size:20minimum-idle:5connection-timeout:30000

📝 面试八股文汇总

Q1: 什么是事务?

事务是一组操作的集合,具有ACID四大特性,保证数据的一致性和完整性。

Q2: ACID分别是什么?

  • 原子性:要么全做,要么全不做
  • 一致性:数据符合业务规则
  • 隔离性:并发事务互不干扰
  • 持久性:提交后永久保存

Q3: 脏读、不可重复读、幻读的区别?

问题现象解决级别
脏读读到未提交数据Read Committed
不可重复读同一数据两次读不一致Repeatable Read
幻读结果集行数变化Serializable

Q4: MySQL默认隔离级别是什么?为什么?

MySQL默认是Repeatable Read(可重复读)。因为MySQL在RR级别通过MVCC解决了幻读问题,所以RR级别既能保证数据一致性,又有较好的性能。

Q5: 如何解决幻读?

  1. 升级到Serializable级别(性能差)
  2. MySQL InnoDB的Next-Key Lock在RR级别解决幻读
  3. 使用乐观锁或悲观锁手动控制

Q6: 事务隔离级别越高越好吗?

不是。隔离级别越高,数据越安全,但并发性能越差。需要根据业务场景在安全和性能之间做权衡。

Q7: 什么情况会导致死锁?

-- 事务AUPDATEaccountSETbalance=800WHEREid=1;UPDATEaccountSETbalance=500WHEREid=2;-- 事务BUPDATEaccountSETbalance=300WHEREid=2;UPDATEaccountSETbalance=900WHEREid=1;-- 相互等待对方释放锁 → 死锁

💎 总结

┌─────────────────────────────────────┐ │ 事务核心特性 │ ├─────────────────────────────────────┤ │ ┌──────┐ ┌──────────┐ ┌──────┐ │ │ │原子性│ │ 一致性 │ │隔离性│ │ │ └──┬───┘ └────┬─────┘ └──┬───┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────┐ │ │ │ 持久性 │ │ │ └─────────────────────────────┘ │ ├─────────────────────────────────────┤ │ 隔离级别演进: │ │ 读未提交 → 读已提交 → 可重复读 → 串行化 │ │ (高性能) (高安全) │ └─────────────────────────────────────┘

一句话总结

事务就是让数据库操作要么全成功要么全失败,ACID四大特性保证数据可靠,四种隔离级别在安全和性能间提供选择。

记忆口诀

事务的四大特性:

原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行
一致性(Consistency):事务执行前后,数据必须保持合法状态
隔离性(Isolation):并发事务之间互不干扰
持久性(Durability):事务一旦提交,数据变更永久有效

隔离级别说明:

  • 读未提交(Read Uncommitted):最低级别,可能读取到未提交数据
  • 读已提交(Read Committed):只能读取已提交的数据
  • 可重复读(Repeatable Read):确保事务内多次读取数据一致
  • 串行化(Serializable):最高级别,事务完全串行执行
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 12:46:07

Windows 实用小工具:PDF ↔ Word 一键互转,无需安装 Office,带实时进度条

大家好,最近一直在用 Python 做一些实用小工具,今天给大家分享一款超轻量、本地离线、无广告无水印的 PDF 与 Word 互转小工具。工具完全基于本地处理,不上传文件、不需要联网、不需要会员,适合学生写论文、打工人日常办公使用。工…

作者头像 李华
网站建设 2026/10/19 12:54:23

基于社交工程与凭证收割的Spotify投票骗局技术剖析

摘要 随着社交媒体平台的深度渗透,网络钓鱼攻击正经历从广撒网式邮件向精准化、情境化即时通讯攻击的范式转移。本文以近期爆发的“Spotify投票骗局”为研究对象,深入剖析了攻击者如何利用熟人社交信任链、伪造官方活动场景以及心理紧迫感诱导机制&#…

作者头像 李华
网站建设 2026/10/29 17:17:57

熊猫AI助理,助力运维,智能护航

告别繁琐工具,用 AI 重构运维与办公效率!我们带来全新运维 办公一体化 AI 工具,聚合多种简单好用、即开即用的 AI 功能,真正做到上手快、实用性强。以下是用户体验后最受欢迎、高频使用的热门功能。

作者头像 李华
网站建设 2026/10/19 17:21:01

深空探测数据接口篇(五):SpaceWire接口

前言在探讨了 1553B(可靠但慢速的“骨干网”)、RS422和 LVDS(极速但缺乏协议约束的“物理层”)之后,本章将对SpaceWire (SpW)进行介绍。在深空探测中,如果说 LVDS 是高速磁悬浮的轨道,那么 Spac…

作者头像 李华
网站建设 2026/10/31 20:35:28

毕设程序java安龙四中网站 基于SpringBoot的安龙四中智慧校园信息服务平台开发 面向数字化教育的安龙四中校园门户网站构建与应用

毕设程序java安龙四中网站lh3pp0i6 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着教育信息化2.0行动的深入推进,中学教育管理正经历从传统纸质化向数字化、智能…

作者头像 李华