当前位置: 首页 > 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.dtcms.com/a/293442.html

相关文章:

  • SQL语句中锁的使用与优化
  • 正则表达式:文本处理的强大工具
  • 傲软录屏 专业高清录屏软件 ApowerREC Pro 下载与保姆级安装教程!!
  • 3.5 模块化编程实践
  • 路径平滑优化算法--Polynomial Spiral(多项式螺旋法)
  • JavaScript 02 数据类型和运算符数组对象
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 【金融机器学习】第四章:风险-收益权衡——Bryan Kelly, 修大成(中文翻译)
  • Linux Bridge Cost
  • Qt多语言支持初步探索
  • Jmeter使用 - 2
  • 【小学】小学学习资料合集(不定时更新,有需要及时保存,避免失效)
  • ubuntu 20.04 安装 cmake 3.26
  • error C++17 or later compatible compiler is required to use ATen.
  • Spring相关概念
  • 在腾讯云上安装gitlab
  • 《C++》面向对象编程--类(中)
  • Linux的进程管理源码相关内容梳理
  • 京东视觉算法面试30问全景精解
  • 洛谷 B3939:[GESP样题 四级] 绝对素数 ← 素数判定+逆序整数
  • 滑动窗口经典问题整理
  • 三维DP深度解析
  • 数学与应用数学专业核心课程解析
  • 【编程练习】
  • day 32 打卡
  • Linux中信号认识及处理和硬件中断与软中断的讲解
  • 生成式人工智能对网络安全的影响
  • 软件工程:软件设计
  • Python机器学习:从零基础到项目实战
  • 一个基于现代C++智能指针的优雅内存管理解决方案