18.事务的隔离性和隔离级别:MySQL面试高频考点全解析

目录

[一、事务隔离性的背景:并发 vs 准确,鱼与熊掌如何兼得?](#一、事务隔离性的背景:并发 vs 准确,鱼与熊掌如何兼得?)

二、MySQL的隔离级别:手动设置"隔离强度"

三、什么是事务的隔离性?

四、隔离级别的核心:解决"数据不准确"的问题

[1. 脏读(Dirty Read)](#1. 脏读(Dirty Read))

[2. 不可重复读(Non-Repeatable Read)](#2. 不可重复读(Non-Repeatable Read))

[3. 幻读(Phantom Read)](#3. 幻读(Phantom Read))

五、四个隔离级别的"挡位"与特性(必背!)

六、如何查看/修改数据库的隔离级别?

[1. 查看隔离级别](#1. 查看隔离级别)

[2. 修改隔离级别(两种方式)](#2. 修改隔离级别(两种方式))

方式一:SET语法(临时生效)

[方式二:SET @@语法(更明确)](#方式二:SET @@语法(更明确))

七、不同隔离级别的性能与安全权衡

八、总结(面试话术速记)


一、事务隔离性的背景:并发 vs 准确,鱼与熊掌如何兼得?

数据库服务器需要并发处理多个客户端的事务(就像"一心两用")。但并发执行很容易"顾此失彼":

  • 提高并发性 → 效率高,但数据准确性可能受影响;

  • 降低并发性 → 准确性高,但效率变低。

不同场景对"效率"和"准确性"的优先级不同:

  • 银行转账:极度关心准确性,效率其次;

  • 抖音点赞/评论/转发数:极度关心效率,准确性可妥协;

  • 其他场景:两者都兼顾。

二、MySQL的隔离级别:手动设置"隔离强度"

MySQL允许我们手动设置事务的隔离级别,隔离性越强,并发越弱(效率低、准确率高);隔离性越弱,并发越强(效率高、准确率低)。

InnoDB引擎支持四种隔离级别(按隔离性从弱到强):

  1. READ UNCOMMITTED(读未提交)

  2. READ COMMITTED(读已提交)

  3. REPEATABLE READ(可重复读,MySQL默认

  4. SERIALIZABLE(串行化)

三、什么是事务的隔离性?

MySQL服务可被多个客户端同时访问,每个客户端的DML语句以事务 为基本单位。当不同客户端对同一张表的同一条数据修改时,事务之间会相互影响。为保证事务执行时互不影响,这种"互不干扰"的特性就是隔离性

四、隔离级别的核心:解决"数据不准确"的问题

隔离级别的本质是对事务执行顺序的干预 ,从而解决"数据不准确"的三种典型问题:脏读、不可重复读、幻读

1. 脏读(Dirty Read)

  • 定义:一个事务读取了另一个未提交事务的数据(相当于读了"无效/错误"的数据)。

  • 示例(READ UNCOMMITTED级别):

  • 解决:READ COMMITTED级别,只允许读取已提交(commit)的数据

2. 不可重复读(Non-Repeatable Read)

  • 定义:同一个事务内,两次读取同一数据,结果不同(因为中间被其他事务修改并提交了)。

  • 示例(READ COMMITTED级别):

  • 解决:REPEATABLE READ级别,MySQL通过快照机制保证同一事务内多次读取结果一致。

3. 幻读(Phantom Read)

  • 定义:同一个事务内 ,两次执行SELECT,结果集行数不同(因为中间被其他事务插入/删除数据)。是"不可重复读"的扩展(不可重复读是单行数据变,幻读是多行数据变)。

  • 示例(REPEATABLE READ级别,特殊情况):

  • 解决:SERIALIZABLE级别,事务完全串行执行(一个事务结束,下一个才执行),从根本上杜绝幻读。

五、四个隔离级别的"挡位"与特性(必背!)

把隔离级别类比成"汽车挡位":隔离性越弱(挡位越低),并发越强;隔离性越强(挡位越高),并发越弱。

隔离级别 脏读 不可重复读 幻读 并发性能 隔离强度(安全性)
READ UNCOMMITTED 存在 存在 存在
READ COMMITTED 解决 存在 存在
REPEATABLE READ 解决 解决 存在 中低 高(MySQL默认)
SERIALIZABLE 解决 解决 解决 最高

六、如何查看/修改数据库的隔离级别?

1. 查看隔离级别

  • 全局作用域:SELECT @@GLOBAL.transaction_isolation;

  • 会话作用域(当前连接):SELECT @@SESSION.transaction_isolation;

2. 修改隔离级别(两种方式)

方式一:SET语法(临时生效)

复制代码
-- 全局级别(所有新连接生效,当前连接不生效)
SET GLOBAL transaction_isolation = 'SERIALIZABLE';  
-- 注意:空格用'-'代替!

-- 会话级别(当前连接生效,断开后失效)
SET SESSION transaction_isolation = 'REPEATABLE-READ';

方式二:SET @@语法(更明确)

复制代码
-- 全局级别
SET @@GLOBAL.transaction_isolation = 'SERIALIZABLE';  

-- 会话级别
SET @@SESSION.transaction_isolation = 'REPEATABLE-READ';

⚠️ 实际开发建议:修改配置文件,永久生效(需重启MySQL)。

七、不同隔离级别的性能与安全权衡

  • 追求安全 :选SERIALIZABLE(但效率最低);

  • 平衡安全与效率 :选REPEATABLE READ(MySQL默认);

  • 追求效率 :选READ COMMITTEDREAD UNCOMMITTED(但要接受数据不准确风险)。

八、总结(面试话术速记)

事务隔离性是MySQL四大特性(ACID)之一,面试高频考点!记住:

  • 隔离级别分4档:读未提交读已提交可重复读串行化(隔离性递增,并发递减);

  • 三大问题:脏读(未提交读)、不可重复读(同事务内数据变化)、幻读(同事务内结果集变化);

  • MySQL默认REPEATABLE READ,通过快照机制解决不可重复读,部分解决幻读;

  • 可通过SET GLOBAL/SESSION或配置文件修改隔离级别。

📌 面试技巧:讲清"隔离级别"和"三大问题"的对应关系,结合场景(银行vs抖音)说明取舍,面试官会觉得你不仅背了概念,还理解了本质!

(如果觉得有用,欢迎关注,面试前翻出来过一遍~)

相关推荐
kyriewen40 分钟前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
火山上的企鹅1 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
程序员二叉1 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
阿狸猿2 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩2 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮2 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@2 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
志栋智能2 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化
syt_biancheng3 小时前
Redis初识
数据库·redis·缓存