事务与隔离级别
1. 这是什么
事务用于保证一组数据库操作要么都成功,要么都失败。
隔离级别描述了事务并发执行时互相可见的程度。
一句话理解:
- 事务解决“这一组操作是不是一个整体”
- 隔离级别解决“多个事务同时跑时会不会互相看乱数据”
2. 为什么重要
很多业务正确性问题,本质上都和这些概念有关:
- 库存扣减
- 账户余额
- 订单状态
- 重复更新
理解事务,才能正确处理关键业务的一致性问题。
3. 先建立直觉:事务边界不是越大越安全
一个常见误区是:
- 觉得把逻辑全包进事务里就一定更稳
其实事务越大,常常意味着:
- 锁持有时间更长
- 并发冲突更大
- 吞吐下降更明显
所以事务设计的核心不是“越大越好”,而是:
- 边界合理
- 正确性和吞吐之间平衡
4. 核心内容
4.1 ACID
事务最基础的四个特性是:
- 原子性
- 一致性
- 隔离性
- 持久性
学习阶段更重要的是抓业务语义,而不是背词本身。
4.2 脏读、不可重复读、幻读
脏读
- 读到了别人未提交的数据
不可重复读
- 同一事务里,两次读取同一行结果不同
幻读
- 同一事务里,两次按条件查询,结果集条数变化
4.3 四种隔离级别
最常见的四种隔离级别:
READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE
学习阶段先抓住一个关键点:
- 隔离越强,通常并发自由度越低
4.4 MVCC 的基本思想
MVCC 的核心价值是:
- 让读操作尽量不和写锁硬碰硬
你可以先把它理解成:
- 通过版本可见性来提升并发读性能
这也是为什么很多事务读场景下,数据库不一定需要靠重锁才能维持可见性。
4.5 提交与回滚
事务最终要么:
- 提交,结果落地
- 回滚,撤销未完成影响
这条线非常关键,因为业务系统最终要靠它保证“半成功状态”不会长期残留。
5. 学习重点
这一章最重要的是掌握:
- 一致性和并发性能之间有权衡
- 事务不是包住所有逻辑就一定更安全
- MVCC 是并发读性能的重要基础
- 隔离级别会直接影响可见性和吞吐
6. 常见问题
6.1 把事务范围开得太大
这是高并发业务里非常常见的风险点。
6.2 不理解隔离级别的代价
只会记名字,不会分析性能影响,是学习中的典型卡点。
6.3 业务需要强一致却只依赖默认设置
默认值不是业务正确性的兜底策略。
7. 动手验证
当前环境没有 mysql 客户端,所以这里整理成“双会话可直接操作”的实验。
7.1 准备测试表
sql
DROP TABLE IF EXISTS tx_demo;
CREATE TABLE tx_demo (
id BIGINT PRIMARY KEY,
balance INT NOT NULL
);
INSERT INTO tx_demo (id, balance) VALUES
(1, 100),
(2, 100);7.2 模拟不可重复读
会话 A
sql
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT balance FROM tx_demo WHERE id = 1;会话 B
sql
START TRANSACTION;
UPDATE tx_demo SET balance = 200 WHERE id = 1;
COMMIT;回到会话 A
sql
SELECT balance FROM tx_demo WHERE id = 1;
COMMIT;7.3 观察点
重点看:
- 两次查询结果是否发生变化
7.4 进一步理解 MVCC
你可以切换隔离级别后重复实验,对比不同级别下:
- 读一致性表现
- 是否更容易出现读写冲突差异
8. 练习建议
- 模拟脏读和不可重复读场景
- 对比不同隔离级别的行为
- 复盘一个事务边界设计案例
- 总结 MVCC 对并发读的收益
9. 自测问题
- 四种隔离级别分别解决了什么问题?
- MVCC 为什么能提升并发读性能?
- 为什么事务边界设计会影响系统吞吐?
- 幻读和不可重复读的核心差别是什么?
10. 自测核对要点
- 事务保证一组操作的整体性
- 隔离级别控制事务间可见性
- MVCC 是提升并发读性能的重要机制
- 事务范围越大,通常并发代价越高