MYSQL中读提交的理解
把数据库想像成一个多人合住的图书馆,每本书就是一条记录。
“读提交”(Read Committed)就是图书馆给读者立的一条规则:
你可以随便翻书,但永远只能看到“已经办妥借还手续、正式上架”的版本——别人正在改的那本脏兮兮草稿,你一眼都看不到。
下面用 4 张图 + 一句口诀让你秒懂:
1. 时间线:两个读者(事务 A、B)同时想读/改同一本书。
```
时间 →
────────────────────────────────
T1 事务 A 开始
T2 事务 B 开始
T3 事务 B 把《算法导论》第 3 页改成 42(未 commit)
T4 事务 A 想读第 3 页
T5 事务 B commit(把新页正式上架)
T6 事务 A 再读第 3 页
```
2. 读提交如何保证?
• 快照机:图书馆给每个读者发一副“时间眼镜”。
• 规则:眼镜只能看到“已 commit”的页,未 commit 的草稿自动过滤。
3. 结果:
• T4 时 A 戴上眼镜 → 第 3 页还是旧值(因为 B 未 commit)。
• T6 时 A 再戴眼镜 → 第 3 页已变成 42(因为 B 已 commit)。
一句话口诀:“读提交,读已交;别人没交,你当没瞧。”
4. 防脏读、允许不可重复读:
• 脏读(Dirty Read)——读到未 commit 的数据 → 被禁止。
• 不可重复读(Non-repeatable Read)——同一事务里两次读结果不同 → 被允许,因为每次读都重新戴“最新已提交”眼镜。
就这么简单:读提交=“只看上架书,不看草稿”。