外观
MySQL 隔离级别,默认是哪个?
⭐ 题目日期:
字节 - 2024/12/17
📝 题解:
MySQL 的默认事务隔离级别是 可重复读(Repeatable Read)。以下是详细解析:
1. 事务隔离级别概述
事务隔离级别定义了多个并发事务之间的可见性和相互影响程度。MySQL 支持四种隔离级别(由低到高):
- 读未提交(Read Uncommitted):事务可以读取其他未提交事务的修改(可能读到“脏数据”)。
- 读已提交(Read Committed):事务只能读取其他已提交事务的修改(解决脏读)。
- 可重复读(Repeatable Read):事务内多次读取同一数据的结果一致(解决不可重复读)。
- 串行化(Serializable):所有事务串行执行(解决幻读,但性能最低)。
2. MySQL 的默认隔离级别
- 默认值:
REPEATABLE READ
(可重复读)。 - 适用存储引擎:InnoDB(MySQL 5.5 后的默认引擎)。
- 原因:在并发性能和数据一致性之间取得平衡,避免不可重复读和部分幻读问题(通过 MVCC 和多版本并发控制优化)。
3. 默认隔离级别的行为
- 不可重复读(Non-Repeatable Read):通过 MVCC(多版本控制)保证同一事务内多次读取数据的一致性。
- 幻读(Phantom Read):
- 在
REPEATABLE READ
下,InnoDB 通过 Next-Key Locks(间隙锁 + 行锁)防止幻读。 - 但某些场景下(如范围查询后插入数据),仍可能发生幻读,需显式加锁(
SELECT ... FOR UPDATE
)。
- 在
4. 查看与修改隔离级别
4.1 查看当前隔离级别
-- MySQL 8.0+(新语法)
SELECT @@transaction_isolation;
-- MySQL 5.x(旧语法)
SELECT @@tx_isolation;
4.2 修改隔离级别
- 会话级修改(仅影响当前连接):
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 全局修改(需重启生效):
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 配置文件修改(永久生效):
[mysqld] transaction-isolation = READ-COMMITTED
5. 各隔离级别对比
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 | 适用场景 |
---|---|---|---|---|---|
Read Uncommitted | ✔️ | ✔️ | ✔️ | 最高 | 几乎不推荐使用 |
Read Committed | ❌ | ✔️ | ✔️ | 较高 | 高并发读场景(如 Oracle 默认) |
Repeatable Read | ❌ | ❌ | ❌(部分解决) | 中等 | 默认值,兼顾一致性与性能 |
Serializable | ❌ | ❌ | ❌ | 最低 | 强一致性要求(如金融交易) |
6. 实际应用建议
- 默认值适用场景:
大多数业务场景(如电商、社交)无需修改默认值,InnoDB 的 MVCC 和锁机制已足够。 - 调整为 READ COMMITTED:
- 需要更高并发性能时(如高频写入场景)。
- 某些场景下可减少锁竞争(如减少间隙锁的使用)。
- 显式加锁:
若需严格避免幻读,可使用SELECT ... FOR UPDATE
或SELECT ... LOCK IN SHARE MODE
。
7. 总结
- 默认隔离级别:
REPEATABLE READ
(可重复读),平衡性能与一致性。 - 核心机制:通过 MVCC 和 Next-Key Locks 解决不可重复读和幻读。
- 调整建议:根据业务场景选择,高频写入可考虑
READ COMMITTED
,强一致性需求使用SERIALIZABLE
。