Skip to content

事务与隔离级别

1. 这是什么

事务用于保证一组数据库操作要么都成功,要么都失败。
隔离级别描述了事务并发执行时互相可见的程度。

一句话理解:

  • 事务解决“这一组操作是不是一个整体”
  • 隔离级别解决“多个事务同时跑时会不会互相看乱数据”

2. 为什么重要

很多业务正确性问题,本质上都和这些概念有关:

  • 库存扣减
  • 账户余额
  • 订单状态
  • 重复更新

理解事务,才能正确处理关键业务的一致性问题。

3. 先建立直觉:事务边界不是越大越安全

一个常见误区是:

  • 觉得把逻辑全包进事务里就一定更稳

其实事务越大,常常意味着:

  • 锁持有时间更长
  • 并发冲突更大
  • 吞吐下降更明显

所以事务设计的核心不是“越大越好”,而是:

  • 边界合理
  • 正确性和吞吐之间平衡

4. 核心内容

4.1 ACID

事务最基础的四个特性是:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

学习阶段更重要的是抓业务语义,而不是背词本身。

4.2 脏读、不可重复读、幻读

脏读

  • 读到了别人未提交的数据

不可重复读

  • 同一事务里,两次读取同一行结果不同

幻读

  • 同一事务里,两次按条件查询,结果集条数变化

4.3 四种隔离级别

最常见的四种隔离级别:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

学习阶段先抓住一个关键点:

  • 隔离越强,通常并发自由度越低

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 是提升并发读性能的重要机制
  • 事务范围越大,通常并发代价越高