004-事务
本篇笔记由ChatGPT-4o生成,注意甄别
1. 📌 一、什么是事务(Transaction)
事务是数据库中最基本的逻辑操作单元,由一组 SQL 操作组成,要么全部成功,要么全部失败回滚,不可只执行其中一部分。
1.1. ✅ 事务四大特性(ACID)
特性 | 含义 |
---|---|
原子性(A) | 事务不可分割,要么全部执行成功,要么全部不执行(转账不能只扣不加) |
一致性(C) | 数据从一个一致状态变到另一个一致状态(钱不能凭空增加或减少) |
隔离性(I) | 并发事务间互不干扰(同时转账时互不影响) |
持久性(D) | 事务提交后的修改是永久的,不会丢失(即使系统宕机) |
2. 📌 二、MySQL 中事务的使用
2.1. 🧭 启动与控制事务:
START TRANSACTION; -- 开始事务
-- 执行 SQL 操作
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
3. 📌 三、事务的典型应用场景
-
用户注册
-
金融转账
-
订单下单
-
数据一致性要求高的场景
4. 📌 四、并发事务可能引发的问题
问题 | 说明 |
---|---|
脏读 | 读到其他事务未提交的数据 |
不可重复读 | 同一事务内两次读取同一数据,结果不同 |
幻读 | 同一事务内两次读取符合条件的数据行数不一致(新增或删除记录) |
丢失更新 | 多个事务同时修改,后写的覆盖前写的结果 |
5. 📌 五、事务隔离级别(Isolation Level)
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | 默认(MySQL) |
---|---|---|---|---|---|
Read Uncommitted | ✅ | ✅ | ✅ | ⭐⭐⭐⭐ | 否 |
Read Committed | ❌ | ✅ | ✅ | ⭐⭐⭐ | 否(Oracle 默认) |
Repeatable Read | ❌ | ❌ | ✅ | ⭐⭐ | ✅(MySQL) |
Serializable | ❌ | ❌ | ❌ | ⭐ | 否 |
🔸 MySQL InnoDB 通过间隙锁(Gap Lock)解决了幻读问题。
6. 📌 六、查看与设置隔离级别
6.1. 🔍 查看当前隔离级别:
SELECT @@TRANSACTION_ISOLATION;
6.2. ⚙ 设置隔离级别(当前会话):
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
7. 📌 七、隔离级别的应用建议
隔离级别 | 建议应用场景 |
---|---|
Read Uncommitted | 不敏感数据查询、测试、对一致性要求极低但需高性能的场景 |
Read Committed | 一般系统使用,读已提交数据(避免脏读) |
Repeatable Read | 常规业务场景(MySQL 默认),保证数据一致,性能也能接受 |
Serializable | 银行、订单等关键业务,强一致性需求、但并发量不大 |
8. 🧠 重点回顾总结
-
✅ 用
START TRANSACTION
开启事务,COMMIT
提交,ROLLBACK
回滚。 -
✅ 避免并发问题要合理设置事务隔离级别。
-
✅ MySQL 默认使用
REPEATABLE READ
,可通过SET SESSION
修改。 -
✅ 隔离级别越高,一致性越强,性能越差,需权衡使用。
-
✅ 幻读在 MySQL 中通过「间隙锁」解决。
9. 📎 InnoDB 事务阻塞(补充建议)
如果你对事务的锁阻塞有深入兴趣,可以继续学习:
-
锁类型:共享锁、排他锁、意向锁、间隙锁、临键锁
-
锁等待与死锁分析:使用
SHOW ENGINE INNODB STATUS
观察当前事务状态
如果你想把这份内容做成 Obsidian 的 callout 卡片或 markdown 笔记,我可以继续帮你格式化整理。是否需要?