🔥 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: 如何解决幻读?
- 升级到Serializable级别(性能差)
- MySQL InnoDB的Next-Key Lock在RR级别解决幻读
- 使用乐观锁或悲观锁手动控制
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):最高级别,事务完全串行执行