Skip to content

03 - SQL 与事务

定位:事务是关系数据库的基石——理解 MVCC、隔离级别、ACID 实现,才能写出正确的高并发代码 面试高频度:⭐⭐⭐⭐⭐


一、板块在体系中的位置

┌──────────────────────────────────────┐
│      01-架构与存储引擎 (地基)          │
│      02-索引与查询优化 (性能)         │
└────────────────┬─────────────────────┘

┌──────────────────────────────────────┐
│      03-SQL与事务 (本板块)            │
│  ┌──────┐ ┌──────┐ ┌──────┐        │
│  │ MVCC  │ │隔离  │ │ACID  │        │
│  │      │ │级别  │ │实现  │        │
│  └──────┘ └──────┘ └──────┘        │
└───────┬──────────┬──────────────────┘
        │          │
        ▼          ▼
┌──────────┐ ┌──────────┐
│ 04-锁    │ │ 05-日志  │
│ (并发)   │ │ (持久化) │
└──────────┘ └──────────┘

二、知识全景图

事务体系

├── 事务特性 (ACID)
│   ├── 原子性 (A) ── Undo Log 保证
│   ├── 一致性 (C) ── 应用层+数据库约束
│   ├── 隔离性 (I) ── 锁 + MVCC
│   └── 持久性 (D) ── Redo Log 保证

├── 并发问题
│   ├── 脏读  ── 读到未提交的数据
│   ├── 不可重复读 ── 同事务内两次读不一样(行被修改)
│   └── 幻读  ── 同事务内两次读结果集不一样(行被插入/删除)

├── 隔离级别
│   ├── READ UNCOMMITTED ── 都不防
│   ├── READ COMMITTED  ── 防脏读 (RC)
│   ├── REPEATABLE READ ── 防脏读+不可重复读 (RR,MySQL 默认)
│   └── SERIALIZABLE    ── 全防(性能极低)

└── MVCC 实现
    ├── 一致性非锁定读 ── 快照读
    ├── 版本链 ── Undo Log 中的历史版本
    └── Read View ── 可见性判定规则

三、子专题导航

#主题面试频率核心内容
**MVCC实现原理**MVCC 实现原理⭐⭐⭐⭐⭐版本链、Read View、快照读与当前读
**事务隔离级别**事务隔离级别⭐⭐⭐⭐⭐脏读/不可重复读/幻读、RC 与 RR 的 MVCC 差异
**事务ACID实现**事务 ACID 实现⭐⭐⭐⭐AID 分别由什么保证、C 的含义

四、核心考点速记

考点1:MVCC 解决什么问题?

MVCC = Multi-Version Concurrency Control
      多版本并发控制

解决的问题:在"读"不阻塞"写"、"写"不阻塞"读"的前提下,
           保证事务看到一致的数据快照

实现方式:每行数据有多个版本(Undo Log 版本链)
          每个事务根据 Read View 决定看到哪个版本

考点2:四种隔离级别解决的问题

隔离级别脏读不可重复读幻读
READ UNCOMMITTED❌ 可能❌ 可能❌ 可能
READ COMMITTED✅ 避免❌ 可能❌ 可能
REPEATABLE READ✅ 避免✅ 避免⚠️ InnoDB 通过间隙锁避免
SERIALIZABLE✅ 避免✅ 避免✅ 避免

考点3:快照读 vs 当前读

sql
-- 快照读(Snapshot Read)—— 不加锁,读历史版本
SELECT * FROM users WHERE id = 1;           -- 普通 SELECT 都是快照读

-- 当前读(Current Read)—— 加锁,读最新版本
SELECT * FROM users WHERE id = 1 FOR UPDATE;  -- 排他锁
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;  -- 共享锁
UPDATE users SET name = 'new' WHERE id = 1;   -- 先当前读再写
DELETE FROM users WHERE id = 1;               -- 先当前读再删
INSERT INTO users ...                          -- 直接写

📚 相关文件

  • 下游板块:**锁机制**
  • 下游板块:**日志系统**
  • 上游板块:**架构与存储引擎**
  • ← 返回 **设计文档**

Knowledge4J — Java 知识库