Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
    • drop、truncate、delete 的区别
    • 聊一聊数据库事务机制
    • 聊一聊 MySQL 中的关联查询
    • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
      • 分库分表之后,id 主键如何处理?
      • 说说在 MySQL 中一条查询 SQL 是如何执行的?
      • 讲解下 DDL、DML、DCL
      • 存储过程和触发器的作用
      • MySQL 如何行转列和列转行
      • 如何查看 SQL 的执行计划
      • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    事务隔离级别有哪些?MySQL 的默认隔离级别是什么

    # 1. 事务隔离级别的定义

    事务隔离级别是 “数据库解决并发事务冲突的规则”,通过限制事务对数据的可见性,避免脏读、不可重复读、幻读等并发异常,MySQL 支持 4 种隔离级别(按严格程度从低到高排序)。

    # 2. 4 种事务隔离级别详解

    隔离级别 核心定义 并发异常情况 适用场景
    读未提交(Read Uncommitted) 事务 A 可读取事务 B 未提交的修改数据 允许脏读、不可重复读、幻读 极少使用(如对数据一致性无要求的临时查询)
    读已提交(Read Committed,RC) 事务 A 只能读取事务 B 已提交的修改数据 禁止脏读,允许不可重复读、幻读 多数互联网场景(如电商商品查询、新闻浏览)
    可重复读(Repeatable Read,RR) 事务 A 在事务内多次读取同一数据,结果一致(无论其他事务是否修改并提交) 禁止脏读、不可重复读,默认禁止幻读 金融、电商订单等对一致性要求高的场景
    串行化(Serializable) 事务串行执行(一个事务完成后,另一个事务才开始),完全隔离 禁止所有并发异常 数据一致性要求极高的场景(如银行转账)

    # 3. 各隔离级别的并发异常示例

    • 脏读:仅读未提交级别允许。事务 B 修改数据未提交,事务 A 读取该数据,事务 B 回滚后,事务 A 读取的是 “脏数据”。
    • 不可重复读:读未提交、读已提交级别允许。事务 A 两次读取同一数据,事务 B 在期间修改并提交,导致两次读取结果不一致。
    • 幻读:读未提交、读已提交级别允许;可重复读级别默认禁止(InnoDB 通过间隙锁实现);串行化级别禁止。事务 A 两次查询同一范围数据,事务 B 在期间插入 / 删除数据并提交,导致两次结果集行数不一致。

    # 4. MySQL 的默认隔离级别

    • MySQL 的默认隔离级别是可重复读(RR),这是 InnoDB 存储引擎的默认配置;

    • 与其他数据库(如 PostgreSQL、Oracle)默认 “读已提交(RC)” 不同,MySQL 的 RR 级别通过 MVCC(多版本并发控制)+ 间隙锁,实现了 “默认禁止幻读”,兼顾了一致性和并发性能;

    • 可通过以下命令查看和修改隔离级别:

      -- 查看当前会话隔离级别
      SELECT @@session.tx_isolation;
      -- 修改当前会话隔离级别为读已提交
      SET session tx_isolation = 'READ-COMMITTED';
      -- 查看全局隔离级别
      SELECT @@global.tx_isolation;
      -- 修改全局隔离级别(需重启会话生效)
      SET global tx_isolation = 'REPEATABLE-READ';
      
      1
      2
      3
      4
      5
      6
      7
      8

    上次更新: 12/30/2025
    聊一聊 MySQL 中的关联查询
    分库分表之后,id 主键如何处理?

    ← 聊一聊 MySQL 中的关联查询 分库分表之后,id 主键如何处理?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式