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

数据库事务隔离级别与 MVCC 机制详解

在数据库并发操作场景中,事务隔离级别是保障数据一致性的核心机制,不同隔离级别对应不同的并发控制策略,而 MVCC(多版本并发控制)则是实现部分隔离级别的关键技术

一、数据库事务隔离级别概述

事务隔离级别定义了多个并发事务之间的相互影响程度,从低到高分为四个级别,不同级别在数据一致性和系统性能之间呈现不同的平衡关系。

1.1 读未提交(Read Uncommitted)

• 定义:最低的隔离级别,允许当前事务读取其他事务尚未提交的数据变更。

• 核心问题:无法避免脏读、不可重复读和幻读。

• 脏读:读取到其他事务未提交的“临时数据”,若后续事务回滚,当前读取的数据将变为无效。

• 适用场景:对数据一致性要求极低,仅追求极致性能的场景(如临时统计查询,无需精确结果),实际业务中极少使用。业务场景基本都不用

1.2 读已提交(Read Committed, RC)

• 定义:允许当前事务读取其他事务已提交的数据变更,是许多数据库的默认隔离级别之一(如 Oracle)。

• 核心能力:可阻止脏读,但仍可能出现不可重复读和幻读。

◦ 不可重复读:同一事务内,对同一字段多次读取,结果因其他事务提交的更新操作而不同。◦ 幻读:同一事务内,执行相同的查询语句,结果因其他事务提交的插入/删除操作而新增或减少数据行。

• 实现依赖:基于 MVCC 机制实现,通过读取数据的“已提交版本”保障数据有效性。

1.3 可重复读(Repeatable Read, RR)

• 定义:MySQL InnoDB 引擎的默认隔离级别,确保同一事务内,对同一字段的多次读取结果一致(除非数据由当前事务自身修改)。

• 核心能力:可阻止脏读和不可重复读,但仍可能出现幻读(需通过额外机制解决)。

• 幻读解决方案:

◦ 升级隔离级别至串行化:所有事务顺序执行,完全避免并发干扰,但会导致性能大幅下降,仅适用于数据一致性要求极高且并发量低的场景。◦ MVCC 解决快照读幻读:针对简单 SELECT(快照读),通过读取数据的历史版本(非最新版本),确保同一事务内查询结果一致。MySQL使用的这个来解决幻读,相对锁解决幻读而言,性能较高。◦ GapLock + Next-KeyLock 解决当前读幻读:针对 SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE 等当前读操作,通过间隙锁(GapLock)和 next-key 锁,锁定查询范围,防止其他事务插入/删除数据,避免幻读。

1.4 串行化(Serializable)

• 定义:最高的隔离级别,强制所有事务按顺序逐个执行,完全禁止并发操作。互联网项目基本没用这个的,项目上线有点并发就会非常卡顿了。

• 核心能力:完全符合 ACID 的隔离要求,可阻止脏读、不可重复读和幻读,数据一致性最强。

• 缺点:极大限制并发性能,仅适用于数据安全性优先于性能的极端场景(如金融核心交易的关键步骤)。在这里插入图片描述

二、MVCC(多版本并发控制)机制

MVCC 是一种高效的并发控制技术,主要用于实现 “读已提交(RC)” 和 “可重复读(RR)” 隔离级别,通过维护数据的多个版本,实现 “读 - 写”“写 - 读” 并发执行,在保障数据一致性的同时提升系统性能。

2.1 MVCC 的核心原理

MVCC 的核心是为每行数据维护多个历史版本,事务读取时根据自身版本号选择可见的数据版本,避免直接加锁导致的并发瓶颈。其关键机制包括:

  1. 事务版本号
    ◦ 系统会为每个新启动的事务分配一个唯一的递增版本号(transaction_id),事务开始时的版本号即为该事务的标识。

    ◦ 数据行的版本号与事务版本号关联,确保事务只能读取符合可见性规则的数据。

  2. 隐藏列与版本链
    ◦ InnoDB 引擎的聚簇索引记录中,默认包含两个隐藏列,用于构建数据的版本链:

     ▪ trx_id:存储每次修改该数据行的事务 ID,记录数据的“修改者”。▪ roll_pointer:存储一个指针,指向该数据行的上一个历史版本(存储在 Undo 日志中),通过该指针可串联所有历史版本,形成“版本链”。
    

    ◦ 注意:插入操作的 Undo 日志无 roll_pointer,因为插入的数据无历史版本。

  3. Undo 日志的作用
    ◦ Undo 日志用于保存数据的历史版本,当事务需要读取历史数据时,通过 roll_pointer 从 Undo 日志中获取对应版本。

    ◦ 事务提交后,Undo 日志不会立即删除,而是根据垃圾回收机制(Purge)在合适时机清理,确保其他事务仍能访问所需的历史版本。

2.2 MVCC 的适用范围与限制

• 适用隔离级别:仅支持 “读已提交(RC)” 和 “可重复读(RR)”,不支持 “读未提交”(需读取未提交数据,与 MVCC 的“版本可见性规则”冲突)和 “串行化”(强制顺序执行,无需 MVCC)。

• 适用读操作类型:

◦ 快照读:简单 SELECT 语句(无 FOR UPDATE、LOCK IN SHARE MODE),通过 MVCC 读取历史版本,无需加锁,并发性能高。◦ 当前读:DELETE、UPDATE、INSERT 及 SELECT ... FOR UPDATE 等操作,需读取数据最新版本,并加锁防止并发修改,不依赖 MVCC 的版本链,而是通过锁机制保障一致性。

2.3 MVCC 与乐观锁的关联

MySQL 的 MVCC 本质是乐观锁的一种实现方式:

• 每行数据的版本号(通过 trx_id 和版本链间接体现)作为乐观锁的“版本标识”。

• 事务更新数据时,会检查当前数据的版本号是否与预期一致(类似 “WHERE version = V” 的逻辑),若一致则更新并生成新版本,若不一致则重试或失败,避免并发冲突。

三、RC 与 RR 隔离级别的应用场景对比

RC 和 RR 均基于 MVCC 实现,但因版本可见性规则不同,适用场景存在显著差异:

】![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b4d312f414f54d87822a8308adc4d046.png

四、关键总结

• 事务隔离级别从低到高为:“读未提交 → 读已提交 → 可重复读 → 串行化”,一致性越强,性能越弱,需根据业务场景权衡选择。

• MVCC 是实现 RC 和 RR 的核心技术,通过版本链和 Undo 日志实现“无锁读”,提升并发性能。

• RR 的幻读需通过“MVCC(快照读)”或“GapLock + Next-KeyLock(当前读)”解决,RC 因每次查询读最新版本,幻读问题更明显。

http://www.dtcms.com/a/360707.html

相关文章:

  • 机器学习(四)KNN算法-分类
  • 哈希表-1.两数之和-力扣(LeetCode)
  • git将当前分支推送到远端指定分支
  • YOLO 目标检测:YOLOv3网络结构、特征输出、FPN、多尺度预测
  • Redis--Lua脚本以及在SpringBoot中的使用
  • 三、Gitee平台使用指南
  • 第 94 场周赛:叶子相似的树、模拟行走机器人、爱吃香蕉的珂珂、最长的斐波那契子序列的长度
  • Eclipse Compiler for Java (ECJ):安装指南与高效快捷键全解析
  • 构建无广告私人图书馆Reader与cpolar让电子书库随身携带
  • 鸿蒙总改变字体大小设置
  • 【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!
  • 深度学习框架与工具使用心得:从入门到实战优化
  • Unity核心概念③:Inspector窗口可编辑变量
  • 电科金仓 KFS 场景化实践路径解析:从行业场景落地看技术价值转化
  • JP4-1-MyLesson项目简介
  • 掌握正则表达式与文本处理:提升 Shell 编程效率的关键技巧
  • Go 语言 sync 包解析
  • [React]监听Form中某个字段的变化
  • vue2》》Computed、Watch
  • 【Vue2 ✨】Vue2 入门之旅(四):生命周期钩子
  • Git从零到远程协作:手把手实战指南
  • C 语言进程通信之信号API
  • [线上问题排查]1.数据库死锁全解析与解决方案
  • 算法:插入排序
  • LeetCode 刷题【58. 最后一个单词的长度、59. 螺旋矩阵 II】
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案
  • Introduction to GIS —— Chapter 4(Raster Data Model)
  • 批量修改用户密码的命令chpasswd
  • FTP - 学习/实践
  • JPEG XS概述