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. 🧠 重点回顾总结


9. 📎 InnoDB 事务阻塞(补充建议)

如果你对事务的锁阻塞有深入兴趣,可以继续学习:


如果你想把这份内容做成 Obsidian 的 callout 卡片或 markdown 笔记,我可以继续帮你格式化整理。是否需要?