当前位置: 首页 > news >正文

数据库隔离级别

隔离级别决定了事务之间的可见性规则,直接影响数据库的并发性能和数据一致性。

SQL 标准定义了 4 种隔离级别,从低到高依次为:读未提交→读已提交→可重复读→串行化。隔离级别越高,对并发问题的解决能力越强,但对性能的消耗也越大(因限制了并发操作)。

一、读未提交(Read Uncommitted, RU)

定义:一个事务可以读取另一个事务 未提交 的修改。

解决的问题:无(是最低级别的隔离,几乎不做任何隔离控制)。

存在的问题:可能出现 脏读、不可重复读、幻读

示例

1、事务 B 执行 "修改数据 X 为 100" 但未提交

2、事务 A 读取 X=100;

3、事务 B 回滚(X 恢复为 50),事务 A 读取的 "100" 是无效的(脏读)。

适用场景:极少使用,仅在对数据一致性要求极低、追求极致并发性能时(如实时监控数据,允许临时脏数据)。

二、读已提交(Read Committed, RC)

定义:一个事务只能读取另一个事务已提交的修改(未提交的修改不可见)。

解决的问题:避免 脏读(因只能读已提交的数据)。

存在的问题:可能出现 不可重复读、幻读

示例

1、事务 A 第一次读取 X=50;

2、事务 B 修改 X 为 100 并提交;

3、事务 A 第二次读取 X=100(与第一次不一致,不可重复读)。

实现原理:通过 "行级锁" 或 "快照读" 实现(如 Oracle 默认用快照读:每个事务读取数据时,获取该数据的 "已提交版本")。

适用场景:大多数互联网业务(如电商订单、支付场景),平衡了一致性和并发性能,是 Oracle、SQL Server 的默认隔离级别

三、可重复读(Repeatable Read, RR)

定义:一个事务在执行期间,多次读取同一批数据的结果始终一致(不受其他事务提交的修改影响)。

解决的问题:避免脏读、不可重复读

存在的问题:可能出现幻读(因无法限制其他事务新增 / 删除符合条件的记录)。

示例

1、事务 A 第一次查询 "年龄> 18 的用户",返回 10 条;

2、事务 B 新增 1 条 "年龄 = 20" 的用户并提交;

3、事务 A 再次查询 "年龄> 18 的用户",返回 11 条(记录数变化,幻读)。

实现原理:通过 "多版本并发控制(MVCC)" 实现(每个事务启动时生成一个 "数据快照",后续读取基于该快照,不受其他事务提交的修改影响)。

特殊说明:MySQL 的 InnoDB 引擎对 RR 做了增强,通过 "间隙锁(Gap Lock)" 避免了部分幻读场景(但并非完全解决,极端情况仍可能出现),因此 InnoDB 的 RR 实际隔离性略高于标准定义。

适用场景:对数据一致性要求较高的业务(如金融交易、库存管理),是 MySQL InnoDB 的默认隔离级别

四、串行化(Serializable, S)

定义:所有事务 "串行执行"(即一个接一个执行,不允许并发操作同一批数据)。

解决的问题:避免 脏读、不可重复读、幻读(是最高级别的隔离,完全保证数据一致性)。

存在的问题:并发性能极差(因本质是 "单线程" 执行,会导致大量事务等待)。

实现原理:通过 "表级锁" 或 "范围锁" 强制事务串行化(如事务 A 操作某范围数据时,其他事务对该范围的读写均被阻塞)。

示例

1、事务 A 执行 "查询年龄> 18 的用户" 并准备修改;

2、事务 B 尝试新增 "年龄 = 20" 的用户时,会被阻塞,直到事务 A 完成并释放锁;

3、因此事务 A 两次查询的结果完全一致,无幻读。

适用场景:仅在对数据一致性要求极高、并发量极低的场景(如银行核心交易的对账操作,不允许任何并发不一致)。

隔离级别对比

隔离级别脏读不可重复读幻读并发性能典型数据库默认值
读未提交(RU)可能可能可能最高几乎无数据库默认
读已提交(RC)不可能可能可能较高Oracle、SQL Server
可重复读(RR)不可能不可能可能中等MySQL InnoDB
串行化(S)不可能不可能不可能最低无数据库默认

不可重复读与脏读的区别

  • 脏读(Dirty Read:读取到其他事务 未提交 的数据;
  • 不可重复读(Non-repeatable Read:读取到其他事务 已提交  修改

不可重复读与幻读的区别

  • 不可重复读(Non-repeatable Read:针对 已存在 数据的 修改
  • 幻读(Phantom Read:针对 新增或删除 的数据行。

人活一世,谋生之道,立世之途,为人之智,尽在书中。-- 烟沙九洲

http://www.lryc.cn/news/595947.html

相关文章:

  • 在vscode 使用 remote-ssh
  • Vue3 面试题及详细答案120道(16-30 )
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现持械检测(C#代码,UI界面版)
  • 【Altium Designer2025】电子设计自动化(EDA)软件——Altium Designer25版保姆级下载安装详细图文教程(附安装包)
  • ob导出租户所有表记录
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • C++中的list(2)简单复现list中的关键逻辑
  • 文本分类与情感分析Python实战
  • liunx运维进阶脚本
  • 2025.7.25论文阅读
  • VUE2 项目学习笔记 ? 语法 v-if/v-show
  • 为何在 Vue 的 v-model 指令中不能使用可选链(Optional Chaining)?
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • JavaWeb学习打卡10(HttpServletRequest详解应用、获取参数,请求转发实例)
  • 分布在内侧内嗅皮层(MEC)的边界细胞对NLP中的深层语义分析的积极影响和启示
  • 短剧小程序系统开发:重塑影视内容传播格局
  • Python爬虫实战:批量下载亚马逊商品图片
  • java多线程编程自用笔记
  • 日常随笔-React摘要
  • 浅谈——游戏中的各种配置格式
  • C++ 模板库map数据结构的概念和使用案例
  • React集成百度【BMap Draw】教程(001):实现距离测量和面积测量
  • Go后端配置文件教程
  • Python 链接各种中间件[Mysql\redis\mssql\tdengine]
  • 发票识别技术原理
  • Redis持久化-AOF
  • Ubuntu 桌面版和服务器版在资源消耗上的对比分析
  • 第十六天(结构体初学)
  • Sa-Token大师:第四章 - 企业级架构与源码实战
  • Events