Interview AiBox logo

Interview AiBox 实时 AI 助手,让你自信应答每一场面试

download免费下载
进阶local_fire_department46 次面试更新于 2025-08-23account_tree思维导图

MySQL支持哪些事务隔离级别?

lightbulb

题型摘要

MySQL支持四种标准的事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和SERIALIZABLE(可串行化)。这些级别在数据一致性和并发性能之间提供不同的权衡。READ UNCOMMITTED级别最低,允许读取未提交数据,存在脏读、不可重复读和幻读问题;READ COMMITTED解决了脏读问题,但仍存在不可重复读和幻读;REPEATABLE READ是MySQL默认级别,解决了前两个问题,并通过MVCC机制在MySQL中解决了幻读;SERIALIZABLE是最高级别,完全隔离事务,但性能最差。选择合适的隔离级别需要根据应用场景在数据一致性和性能之间取得平衡。

MySQL支持的事务隔离级别

MySQL支持四种标准的事务隔离级别,这些隔离级别是为了解决并发事务可能带来的各种问题而设计的。下面详细介绍这四种隔离级别。

1. READ UNCOMMITTED(读未提交)

定义:这是最低的隔离级别,允许事务读取未被其他事务提交的数据变更。

特点

  • 事务可以读取到其他事务尚未提交的数据(脏读)
  • 可能导致脏读(Dirty Read)、不可重复读(Non-repeatable Read)和幻读(Phantom Read)问题
  • 性能最好,但数据安全性最低

问题示例

  • 脏读:事务A读取了事务B尚未提交的数据,如果事务B回滚,事务A读取的数据就是无效的

2. READ COMMITTED(读已提交)

定义:只允许事务读取已经被其他事务提交的数据变更。

特点

  • 解决了脏读问题
  • 但仍可能出现不可重复读和幻读问题
  • 大多数数据库系统的默认隔离级别(如Oracle)

问题示例

  • 不可重复读:事务A在同一个事务中两次读取同一数据,期间事务B修改并提交了该数据,导致事务A两次读取的结果不同

3. REPEATABLE READ(可重复读)

特点

  • 确保在同一事务中多次读取同一数据的结果是一致的
  • 解决了脏读和不可重复读问题
  • 是MySQL的默认隔离级别
  • 仍可能出现幻读问题

MySQL的特殊处理

  • MySQL通过MVCC(多版本并发控制)和间隙锁(Gap Lock)技术在REPEATABLE READ级别解决了幻读问题

问题示例

  • 幻读:事务A按照一定条件读取数据,期间事务B插入或删除了符合该条件的数据,导致事务A再次按照相同条件读取时,发现数据条目发生了变化

4. SERIALIZABLE(可串行化)

定义:最高的隔离级别,完全隔离事务之间的相互影响。

特点

  • 通过锁定事务涉及的所有数据来实现完全隔离
  • 解决了脏读、不可重复读和幻读所有问题
  • 性能最差,但数据安全性最高
  • 相当于事务串行执行,没有并发

使用场景

  • 对数据一致性要求极高的场景
  • 并发量不大的系统

事务隔离级别对比

下面用表格对比四种隔离级别及其解决的问题:

隔离级别 脏读 不可重复读 幻读 性能影响
READ UNCOMMITTED 可能 可能 可能 最低
READ COMMITTED 不可能 可能 可能 较低
REPEATABLE READ 不可能 不可能 可能(MySQL中不可能) 中等
SERIALIZABLE 不可能 不可能 不可能 最高

MySQL中设置事务隔离级别

在MySQL中,可以通过以下方式设置事务隔离级别:

-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [隔离级别];

-- 设置当前会话的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL [隔离级别];

-- 为下一个事务设置隔离级别
SET TRANSACTION ISOLATION LEVEL [隔离级别];

示例:

-- 设置为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 设置为可重复读(MySQL默认)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

查看当前事务隔离级别

-- 查看全局隔离级别
SELECT @@global.transaction_isolation;

-- 查看当前会话的隔离级别
SELECT @@session.transaction_isolation;

各隔离级别的适用场景

  1. READ UNCOMMITTED

    • 极少使用
    • 适用于对数据一致性要求不高,但性能要求极高的场景
  2. READ COMMITTED

    • 适用于大多数OLTP(在线事务处理)系统
    • 在数据一致性和性能之间取得良好平衡
    • 适合高并发、短事务的场景
  3. REPEATABLE READ

    • MySQL的默认隔离级别
    • 适用于需要事务内数据一致性保证的场景
    • 适合报表统计、数据分析等场景
  4. SERIALIZABLE

    • 适用于对数据一致性要求极高的场景
    • 如金融交易、订单处理等关键业务
    • 适合并发量不大的系统

MySQL的MVCC机制

MySQL在REPEATABLE READ隔离级别下通过MVCC(多版本并发控制)机制解决了幻读问题。MVCC的工作原理如下:

  1. 每行数据都有多个版本,每次修改都会生成一个新版本
  2. 读取操作会读取符合当前事务隔离级别的数据版本
  3. 写入操作会创建新版本的数据行
  4. 通过undo log来实现版本回滚

这种机制使得读操作不会阻塞写操作,写操作也不会阻塞读操作,提高了并发性能。

事务隔离级别与锁的关系

不同隔离级别使用不同的锁机制:

  1. READ UNCOMMITTED

    • 几乎不加锁
    • 可能会读取到未提交的数据
  2. READ COMMITTED

    • 写操作会加行锁
    • 读操作不加锁,使用快照读取
  3. REPEATABLE READ

    • 写操作会加行锁
    • 读操作使用MVCC快照
    • MySQL还会使用间隙锁防止幻读
  4. SERIALIZABLE

    • 读操作也会加锁(共享锁)
    • 写操作加排他锁
    • 可能导致大量锁争用
--- title: MySQL事务隔离级别及其特点 --- graph TD A["MySQL事务隔离级别"] --> B["READ UNCOMMITTED<br>读未提交"] A --> C["READ COMMITTED<br>读已提交"] A --> D["REPEATABLE READ<br>可重复读"] A --> E["SERIALIZABLE<br>可串行化"] B --> F["特点:"] B --> G["问题:"] F --> H["可读取未提交数据"] F --> I["性能最好"] G --> J["脏读"] G --> K["不可重复读"] G --> L["幻读"] C --> M["特点:"] C --> N["问题:"] M --> O["只读取已提交数据"] M --> P["性能较好"] N --> Q["不可重复读"] N --> R["幻读"] D --> S["特点:"] D --> T["问题:"] S --> U["事务内数据一致"] S --> V["MySQL默认级别"] S --> W["通过MVCC解决幻读"] T --> X["标准下可能有幻读<br>(MySQL中已解决)"] E --> Y["特点:"] E --> Z["问题:"] Y --> AA["完全隔离"] Y --> AB["数据最安全"] Y --> AC["性能最差"] Z --> AD["无并发问题"]
--- title: 不同隔离级别下并发事务的交互示例 --- sequenceDiagram participant T1 as 事务1 participant T2 as 事务2 participant DB as 数据库 Note over T1,T2: READ UNCOMMITTED 级别 T1->>DB: 开始事务 T1->>DB: UPDATE users SET balance = 1000 WHERE id = 1 T2->>DB: 开始事务 T2->>DB: SELECT balance FROM users WHERE id = 1 DB-->>T2: 返回 1000 (脏读) T1->>DB: ROLLBACK Note over T1,T2: 事务2读取了事务1未提交的数据 Note over T1,T2: READ COMMITTED 级别 T1->>DB: 开始事务 T1->>DB: UPDATE users SET balance = 1000 WHERE id = 1 T1->>DB: COMMIT T2->>DB: 开始事务 T2->>DB: SELECT balance FROM users WHERE id = 1 DB-->>T2: 返回 1000 T1->>DB: UPDATE users SET balance = 2000 WHERE id = 1 T1->>DB: COMMIT T2->>DB: SELECT balance FROM users WHERE id = 1 DB-->>T2: 返回 2000 (不可重复读) Note over T1,T2: REPEATABLE READ 级别 T1->>DB: 开始事务 T1->>DB: SELECT balance FROM users WHERE id = 1 DB-->>T1: 返回 1000 T2->>DB: 开始事务 T2->>DB: UPDATE users SET balance = 2000 WHERE id = 1 T2->>DB: COMMIT T1->>DB: SELECT balance FROM users WHERE id = 1 DB-->>T1: 返回 1000 (可重复读) Note over T1,T2: SERIALIZABLE 级别 T1->>DB: 开始事务 T1->>DB: SELECT * FROM users WHERE balance > 500 DB-->>T1: 返回结果集 T2->>DB: 开始事务 T2->>DB: INSERT INTO users (id, name, balance) VALUES (2, 'Alice', 600) Note over T2: 等待事务1释放锁 T1->>DB: COMMIT Note over T2: 事务2获得锁 T2->>DB: COMMIT
account_tree

思维导图

Interview AiBox logo

Interview AiBox — 面试搭档

不只是准备,更是实时陪练

Interview AiBox 在面试过程中提供实时屏幕提示、AI 模拟面试和智能复盘,让你每一次回答都更有信心。

AI 助读

一键发送到常用 AI

MySQL支持四种标准的事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和SERIALIZABLE(可串行化)。这些级别在数据一致性和并发性能之间提供不同的权衡。READ UNCOMMITTED级别最低,允许读取未提交数据,存在脏读、不可重复读和幻读问题;READ COMMITTED解决了脏读问题,但仍存在不可重复读和幻读;REPEATABLE READ是MySQL默认级别,解决了前两个问题,并通过MVCC机制在MySQL中解决了幻读;SERIALIZABLE是最高级别,完全隔离事务,但性能最差。选择合适的隔离级别需要根据应用场景在数据一致性和性能之间取得平衡。

智能总结

深度解读

考点定位

思路启发

auto_awesome

相关题目

请解释TCP三次握手的过程。

TCP三次握手是建立可靠网络连接的关键过程,通过SYN、SYN+ACK和ACK三个数据包的交换,确保客户端和服务端都具备收发能力并同步序列号。第一次握手客户端发送SYN包并进入SYN_SENT状态;第二次握手服务端回复SYN+ACK包并进入SYN_RCVD状态;第三次握手客户端发送ACK包,双方都进入ESTABLISHED状态,连接建立完成。三次握手而非两次或四次的设计是为了在保证可靠性的同时避免不必要的延迟和潜在问题。

arrow_forward

TCP和UDP有什么区别?

TCP和UDP是两种核心的传输层协议,主要区别在于:TCP是面向连接的可靠传输协议,通过三次握手建立连接,提供确认重传、流量控制和拥塞控制机制,保证数据不丢失、不重复、按序到达,适用于文件传输、电子邮件等高可靠性场景;UDP是无连接的不可靠传输协议,无需建立连接,直接发送数据报,不保证数据可靠性,但传输速度快、开销小,适用于实时音视频、在线游戏、DNS查询等实时性要求高的场景。选择哪种协议取决于应用对可靠性和实时性的需求权衡。

arrow_forward

什么是跨域问题?如何解决前端跨域请求?

跨域问题是浏览器的同源策略导致的,限制了一个域的文档或脚本获取另一个域的资源。常见解决方案包括:JSONP(利用script标签无跨域限制)、CORS(通过HTTP头部控制访问权限)、代理服务器(同源转发)、WebSocket(双向通信协议)、postMessage(跨文档通信)、document.domain(设置相同主域)和window.name(利用窗口名称特性)。选择方案时需考虑兼容性、安全性和场景需求,现代应用首选CORS,实时通信可选WebSocket,无法控制服务器时可考虑代理。

arrow_forward

什么是跨域?有哪些解决跨域的方法?

跨域是Web开发中因浏览器同源策略导致的限制,当协议、域名或端口不同时发生。解决跨域的主要方法有:1) CORS(跨域资源共享),通过服务器设置HTTP响应头实现,是最推荐的标准化方案;2) JSONP,利用script标签跨域特性,但仅支持GET请求;3) 代理服务器,通过同源服务器转发请求;4) WebSocket,双向通信协议,不受同源限制;5) postMessage,HTML5 API,用于窗口间安全通信;6) document.domain,适用于子域间通信;7) window.name和location.hash,利用浏览器特性实现但安全性较低。选择方案需考虑安全性、兼容性、通信类型和实现复杂度等因素。

arrow_forward

请详细解释HTTPS的工作原理和加密过程。

HTTPS是HTTP的安全版本,通过SSL/TLS协议实现数据加密、身份验证和完整性保护。其工作原理主要分为两个阶段:SSL/TLS握手阶段和数据传输阶段。在握手阶段,客户端和服务器协商加密算法、验证服务器身份并生成会话密钥;在数据传输阶段,使用会话密钥进行对称加密通信。HTTPS结合了对称加密(效率高)和非对称加密(安全密钥交换)的优点,通过数字证书验证服务器身份,防止中间人攻击,并使用哈希函数保证数据完整性。随着网络安全意识的提高,HTTPS已成为网站的标准配置。

arrow_forward

阅读状态

阅读时长

7 分钟

阅读进度

10%

章节:10 · 已读:1

当前章节: 1. READ UNCOMMITTED(读未提交)

最近更新:2025-08-23

本页目录

Interview AiBox logo

Interview AiBox

AI 面试实时助手

面试中屏幕实时显示参考回答,帮你打磨表达。

免费下载download

分享题目

复制链接,或一键分享到常用平台

外部分享