事务是确保数据库操作原子性、一致性、隔离性、持久性的核心机制
事务级别
| 隔离级别 | 脏读 | 可重复读 | 幻读 | 实现原理简述 |
|---|---|---|---|---|
| 读未提交 | 可能 | 可能 | 可能 | 几乎不加锁,直接读最新数据。 |
| 读已提交 | 不会 | 可能 | 可能 | 语句级快照(每次SELECT生成快照)。 |
| 可重复读 | 不会 | 不会 | 可能 | 事务级快照(第一次SELECT生成快照)。InnoDB通过间隙锁基本解决幻读。 |
| 串行化 | 不会 | 不会 | 不会 | 通过强制加锁,使事务串行执行。 |
注:InnoDB默认级别是“可重复读”,且通过Next-Key Locks(记录锁+间隙锁)在很大程度上避免了幻读。
幻读 vs 脏读 vs 不可重复读
它们都属于并发问题,但侧重点不同,这个对比能帮你更精准地理解:
| 问题 | 核心焦点 | 发生场景 | 简单比喻 |
|---|---|---|---|
| 脏读 | 数据内容,读到了未提交的“脏”数据。 | 读未提交隔离级别。 | 看到别人未提交的草稿。 |
| 不可重复读 | 同一行数据的内容被修改。 | 读已提交级别可能发生。 | 同一本书,别人改动了内容。 |
| 幻读 | 结果集的行数发生变化(新增或删除行)。 | 可重复读级别下可能发生。 | 书架上书的总数变了。 |
如何避免幻读
MySQL的InnoDB引擎在可重复读级别下,通过一套组合拳很大程度上避免了幻读,而非完全杜绝
