在数据库中,事务隔离级别是保证数据一致性和并发控制的重要手段。MySQL 中主要支持四种隔离级别:
-
Read Uncommitted(读未提交)
-
Read Committed(读已提交)
-
Repeatable Read(可重复读)
-
Serializable(可串行化)
本文将详细介绍这四种隔离级别的特点、实现原理及它们与事务的四大特性(ACID)之间的关系。
一、事务的四大原则(ACID)
-
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不会只执行部分操作。
-
一致性(Consistency):事务执行前后,数据库的完整性约束保持不变。
-
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务。
-
持久性(Durability):事务提交后,其结果是永久性的,即使系统崩溃也不会丢失。
隔离性是通过不同的隔离级别来实现的,防止脏读、不可重复读和幻读等问题。
二、隔离级别与并发问题
| 问题 | 描述 |
|---|---|
| 脏读(Dirty Read) | 读取到未提交事务修改的数据 |
| 不可重复读(Non-Repeatable Read) | 同一事务中多次读取同一数据结果不同 |
| 幻读(Phantom Read) | 事务中两次查询结果不一致,出现新增或删除的数据 |
三、四种隔离级别详解
1. Read Uncommitted(读未提交)
-
描述:事务可以读取其他事务未提交的数据。
-
并发问题:可能产生脏读、不可重复读和幻读。
-
实现:不使用 MVCC,也不加锁,直接读取最新数据(包括未提交数据)。
-
优缺点:性能最好,数据一致性最差。
2. Read Committed(读已提交)
-
描述:事务只能读取其他已提交事务的数据。
-
并发问题:防止脏读,但可能产生不可重复读和幻读。
-
实现:使用 MVCC,读取时每次生成快照,读取的是最新已提交版本;写时加锁。
-
优缺点:平衡了性能和一致性。
3. Repeatable Read(可重复读)【MySQL 默认】
-
描述:同一事务多次读取同一数据,结果一致。
-
并发问题:防止脏读和不可重复读,幻读通过间隙锁防止。
-
实现:
-
使用 MVCC,事务开始时生成快照,整个事务读同一个版本。
-
采用间隙锁(next-key locks)防止幻读。
-
加锁写操作,防止数据冲突。
-
-
优缺点:保证较强的一致性,性能较好。
4. Serializable(可串行化)
-
描述:最高级别隔离,事务串行执行。
-
并发问题:完全避免脏读、不可重复读和幻读。
-
实现:对读写操作均加锁,强制事务串行执行。
-
优缺点:最安全,但性能最差,适合要求极高一致性的场景。
四、隔离级别的实现机制
MySQL InnoDB 存储引擎主要通过以下机制实现隔离级别:
| 机制 | 说明 |
|---|---|
| 多版本并发控制 (MVCC) | 利用隐藏的版本号和 Undo Log,允许事务读取数据快照,减少锁争用。 |
| 行锁与间隙锁 | 行锁用于加锁具体记录,间隙锁用于防止幻读(如可重复读使用的 next-key lock)。 |
| 快照读取 (Snapshot Read) | 事务读取快照数据版本,避免读锁,提升并发性能。 |
| 当前读取 (Current Read) | 读取最新数据且加锁,通常用于写操作和带锁的读操作。 |
五、总结对比表
| 隔离级别 | 是否用 MVCC | 快照更新时间 | 读操作加锁 | 防脏读 | 防不可重复读 | 防幻读 | 性能 |
|---|---|---|---|---|---|---|---|
| Read Uncommitted | 否 | 不使用快照 | 否 | 否 | 否 | 否 | 最高 |
| Read Committed | 是 | 每次读取时新快照 | 否 | 是 | 否 | 否 | 较高 |
| Repeatable Read | 是 | 事务开始时快照 | 行锁+间隙锁 | 是 | 是 | 是 | 平衡 |
| Serializable | 否或部分 | N/A | 是(读写全锁) | 是 | 是 | 是 | 最低 |
六、事务隔离级别选择建议
-
高性能要求,允许一定脏读风险:可选择 Read Uncommitted,但很少用。
-
大多数 OLTP 应用:Read Committed 或 Repeatable Read,MySQL 默认的 Repeatable Read 通常是最佳选择。
-
严格数据一致性,且能接受较低性能:Serializable。
2198

被折叠的 条评论
为什么被折叠?



