Skip to content

MySQL 隔离级别,默认是哪个?

约 758 字大约 3 分钟

MySQL字节

2025-03-13

⭐ 题目日期:

字节 - 2024/12/17

📝 题解:

MySQL 的默认事务隔离级别是 可重复读(Repeatable Read)。以下是详细解析:


1. 事务隔离级别概述

事务隔离级别定义了多个并发事务之间的可见性和相互影响程度。MySQL 支持四种隔离级别(由低到高):

  1. 读未提交(Read Uncommitted):事务可以读取其他未提交事务的修改(可能读到“脏数据”)。
  2. 读已提交(Read Committed):事务只能读取其他已提交事务的修改(解决脏读)。
  3. 可重复读(Repeatable Read):事务内多次读取同一数据的结果一致(解决不可重复读)。
  4. 串行化(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. 实际应用建议

  1. 默认值适用场景
    大多数业务场景(如电商、社交)无需修改默认值,InnoDB 的 MVCC 和锁机制已足够。
  2. 调整为 READ COMMITTED
    • 需要更高并发性能时(如高频写入场景)。
    • 某些场景下可减少锁竞争(如减少间隙锁的使用)。
  3. 显式加锁
    若需严格避免幻读,可使用 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE

7. 总结

  • 默认隔离级别REPEATABLE READ(可重复读),平衡性能与一致性。
  • 核心机制:通过 MVCC 和 Next-Key Locks 解决不可重复读和幻读。
  • 调整建议:根据业务场景选择,高频写入可考虑 READ COMMITTED,强一致性需求使用 SERIALIZABLE